home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / DCC_3DE.ZIP / DUCK.ASM < prev    next >
Assembly Source File  |  1996-01-25  |  83KB  |  2,540 lines

  1. ; ============================================================================
  2. ; THE FINAL DONUT ROUTINE by ZJACK with assistance from X-wizard
  3. ; ============================================================================
  4. ; up to 65536 polys
  5. ; ============================================================================
  6. ; Double buffered delta flipping + align fixed polygon fill....
  7. ; ============================================================================
  8.  
  9. .model small
  10. .stack 4096h
  11. .486P
  12.  
  13.  
  14. TEXTURE segment para public
  15. include texture2.db                ;256x256x256 texture RAW
  16. TEXTURE ends
  17.  
  18. DCC segment para public
  19. db 65500 dup (0)                   ;virtual screen
  20. DCC ends
  21.  
  22. VIRTUAL segment para public
  23. db 65500 dup (0)                   ;virtual screen
  24. VIRTUAL ends
  25.  
  26.  
  27. .code
  28.       include jumps.asm
  29.       mov ax,4300h
  30.       int 2fh
  31.       cmp al,80h
  32.       je @XMSOK
  33.       mov byte ptr cs:[errr],2  ;no xms-driver installed
  34.       jmp exit
  35.       @XMSOK:
  36.       smsw ax
  37.       test ax,1
  38.       je NOTV86MODE             ;qemm test...
  39.       mov byte ptr cs:[errr],7
  40.       jmp exit
  41.       NOTV86MODE:
  42.       call getsomexms  ;reserves some XMS
  43.       call xmslock     ;locks the xms-block
  44.       call copyright   ;copyright msg
  45.       call loadobject  ;loads to objects needed to XMS
  46.       xor ax,ax
  47.       mov si,offset yadd
  48.       LLL:
  49.       mov word ptr cs:[si],ax    ;yadd (0..199)*320 table....
  50.       add si,2
  51.       add ax,320
  52.       cmp ax,64000
  53.       jne LLL
  54.       mov ax,13h
  55.       int 10h
  56.       call palette
  57.       xor di,di
  58.       mov si,768+10
  59.       push seg dcc
  60.       pop fs
  61.       push 0a000h
  62.       pop ds
  63.       IK:
  64.       mov byte ptr ds:[di],0
  65.       mov byte ptr fs:[di],0
  66.       inc di
  67.       inc si
  68.       cmp di,64000
  69.       jne IK
  70.       push cs
  71.       pop ds
  72.       call prefix                      ;XY's & stuff, prepare env-buffers
  73.       call updateworld                 ;first time settings
  74.       mov eax,dword ptr cs:[sorttixms]
  75.       shr eax,2                        ;sort tables are word aligned,
  76.       jnc FIX1o                        ;make them to dword aligned....
  77.       add dword ptr cs:[sorttixms],2
  78.       FIX1o:
  79.       mov eax,dword ptr cs:[onearrayxms]
  80.       shr eax,2
  81.       jnc FIX2o
  82.       add dword ptr cs:[onearrayxms],2
  83.       FIX2o:
  84.       mov word ptr cs:[camerazpos],8500    ;too small z -> CRASHH!!!!!!!
  85.       mov word ptr cs:[worldxangle],256+512
  86.       mov word ptr ds:[world+34+12],512
  87.                mov ax,word ptr ds:[worldxangle]
  88.                mov word ptr ds:[world+34+10],ax
  89.                mov ax,word ptr ds:[worldzangle]
  90.                mov word ptr ds:[world+34+14],ax
  91.  
  92.         xor di,di
  93.         xor ax,ax
  94.         @FLOOP:
  95.         mov cx,offset horline
  96.         add cx,ax
  97.         mov word ptr cs:[kadd+di],cx
  98.         add cx,offset HORLINE2- offset HORLINE
  99.         mov word ptr cs:[kadd2+di],cx
  100.         add ax,offset M_LOPPU - offset M_ALKU
  101.         add di,2
  102.         cmp di,640
  103.         jne @FLOOP
  104.  
  105. MAIN:
  106.  
  107.         call doenginestuff               ;call the routine
  108.         cmp dword ptr cs:[frame],208     ;208 frames motion have we....
  109.         jae CRASH
  110.         cmp byte ptr cs:[errr],0
  111.         jne crash
  112.         in al,60h
  113.         cmp al,1
  114.         jne MAIN
  115. CRASH:
  116.         mov ax,003h
  117.         int 10h
  118.         jmp exit
  119.  
  120. ;--------------------------------------------------------------------------
  121.  
  122. flipsdelta:
  123.              push 0a000h
  124.              pop es
  125.          ;    push seg back
  126.          ;    pop gs
  127.              mov ax,seg dcc
  128.              mov bx,seg virtual
  129.              cmp byte ptr cs:[flipflop],1
  130.              jne PASSSSSS2
  131.              mov ax,seg virtual
  132.              mov bx,seg dcc
  133.              PASSSSSS2:
  134.              mov ds,ax
  135.              mov fs,bx
  136.              xor di,di
  137.              xor ebx,ebx
  138.              dOL:
  139.              rept 160
  140.              mov eax,dword ptr ds:[di]
  141.              cmp eax,dword ptr fs:[di]    ;delta checking
  142.              db 74h, 04h                  ;4 pixel tolerance
  143.              mov es:[di],eax
  144.           ;   mov eax,gs:[di]       ;this on if you want the background
  145.              mov fs:[di],ebx        ;and eax here
  146.              add di,4
  147.              endm
  148.              cmp di,64000
  149.              jne dOL
  150.              ret
  151.  
  152. ;--------------------------------------------------------------------------
  153. loadobject:
  154.            mov word ptr cs:[swap],0
  155.            mov eax,dword ptr cs:[objectxms]
  156.            mov dword ptr cs:[lastxms],eax
  157.            mov dword ptr cs:[elementxms],eax
  158. LEFTELEMENTS:
  159.            push cs
  160.            pop ds
  161.            clc
  162.            mov ax,3d00h    ;open file for reading
  163.            mov dx,word ptr cs:[swap] ;file number
  164.            shl dx,3        ;file name length=8 (7+zero)
  165.            add dx,offset names
  166.            int 21h
  167.            jnc @FILEOK
  168.            pop cx                 ;removes the return address from stack
  169.            mov byte ptr cs:[errr],4 ;file-error
  170.            jmp exit
  171.            @FILEOK:
  172.            mov esi,dword ptr cs:[lastxms]
  173.            mov bx,ax    ;Bx=filehandle
  174.            mov ax,0
  175.            mov es,ax     ;flat memory model...
  176.            mov word ptr cs:[fhandle],bx
  177.            @LOADMORE:
  178.            mov bx,word ptr cs:[fhandle]
  179.            mov ah,3fh
  180.            mov cx,65000  ;read 65000 bytes
  181.            push seg dcc
  182.            pop ds
  183.            xor dx,dx
  184.            int 21h
  185.            mov cx,ax
  186.            cmp ax,0
  187.            je fileend      ;if we are in eof then ax is zero
  188.            xor di,di
  189.            TRANSFER:
  190.            mov al,byte ptr ds:[di]  ;get byte from buffer1
  191.            mov byte ptr es:[esi],al ;put it into the xmsblock
  192.            inc di
  193.            inc esi
  194.            cmp di,cx          ;cx=how many bytes loaded this time
  195.  
  196.            jne TRANSFER
  197.            push cs
  198.            pop ds
  199.            mov dx,offset dot  ;progress dot.....
  200.            mov ah,09h
  201.            int 21h
  202.            jmp @LOADMORE
  203.            fileend:
  204.            mov dword ptr cs:[lastxms],esi    ;offset to next object
  205.            inc word ptr cs:[swap]
  206.            mov bx,word ptr cs:[swap]
  207.            add bx,bx
  208.            add bx,bx
  209.            mov dword ptr cs:[elementxms+bx],esi ;save the object ptrs
  210.            mov bx,word ptr cs:[fhandle]
  211.            mov ah,3eh
  212.            int 21h              ;close the file
  213.            mov ax,word ptr cs:[elements]
  214.            cmp word ptr cs:[swap],ax
  215.            jne LEFTELEMENTS
  216.            ret
  217.  
  218.  
  219. getsomexms:
  220.             push cs
  221.             pop ds
  222.             mov ax,4310h
  223.             int 2fh                              ;get the driver location
  224.             mov word ptr cs:[xmscontrol],bx
  225.             mov word ptr cs:[xmscontrol+2],es
  226.             mov ah,09h
  227.             mov dx,(400)
  228.             call cs:[xmscontrol]
  229.             cmp ax,1
  230.             je @MEMOK
  231.             pop cx                    ;cleans the stack
  232.             mov byte ptr cs:[errr],3
  233.             jmp exit                  ;not enough XMS
  234.             @MEMOK:
  235.             mov word ptr cs:[xhandle],dx
  236.             ret
  237.  
  238. freexms:
  239.             mov ah,0ah
  240.             mov dx,word ptr cs:[xhandle]
  241.             call cs:[xmscontrol]
  242.             ret
  243.  
  244. xmslock:
  245.              mov ah,0ch
  246.              mov dx,word ptr cs:[xhandle]
  247.              call cs:[xmscontrol]
  248.              mov ax,dx
  249.              shl eax,16
  250.              mov ax,bx
  251.              mov ecx,eax
  252.              shr ecx,1
  253.              jnc ALIGNis2
  254.              inc eax              ;make sure that pointers are word-aligned.
  255.              ALIGNis2:
  256.              mov dword ptr cs:[objectxms],eax
  257.              mov dword ptr cs:[elementxms],eax
  258.              add eax,(64)*1024                ;1.0megz for objects
  259.              mov dword ptr cs:[projectionbuffer],eax   ;0.5megz for matrix
  260.              add eax,(64)*1024
  261.              mov dword ptr cs:[envbufxms],eax   ;environment buf
  262.              add eax,(64)*1024
  263.              mov dword ptr cs:[sorttixms],eax   ;0.1 megz sortti
  264.              add eax,(64)*1024
  265.              mov dword ptr cs:[onearrayxms],eax ;0.1 megz onearray
  266.              ret
  267.  
  268. unlock:
  269.              push ds
  270.              mov ah,0dh
  271.              mov dx,word ptr cs:[xhandle]
  272.              call cs:[xmscontrol]
  273.              pop ds
  274.              ret
  275.  
  276.  
  277. ;-------------------------------------------------------------------------
  278. doenginestuff:
  279.             ;  call morph
  280.                call WORLDINIT
  281.                mov word ptr cs:[swap],0
  282.                @INITOBJECTS:
  283.                call WORLDHANDLE
  284.                inc word ptr cs:[swap]
  285.                mov ax,word ptr cs:[world] ;how many objects
  286.                cmp word ptr cs:[swap],ax
  287.                jne @INITOBJECTS
  288.                call sortobjects
  289.                mov word ptr cs:[swap],0
  290. @OBJECTSLEFT:
  291.                mov bx,word ptr cs:[swap]
  292.                shl bx,5
  293.                mov ax,word ptr cs:[zclipnear]
  294.                cmp word ptr cs:[(bx+world+2)+16+4+2],ax
  295.                jng @ALLFACESHIDDEN   ;object.in.world is behind the camera!
  296.                call setobject
  297.                call rotate
  298.                call initsortbuffer
  299.                cmp word ptr cs:[facecount],0
  300.                je @ALLFACESHIDDEN
  301.                call bytesort     ;remove if you like unsorted stuff ;)
  302.                call environment  ;remove if you like, default U&Vs sucks...
  303.                call txdrawpolys
  304.                @ALLFACESHIDDEN:
  305.                inc word ptr cs:[swap]
  306.                mov ax,word ptr cs:[world] ;how many objects
  307.                cmp word ptr cs:[swap],ax
  308.                jne @OBJECTSLEFT
  309.             ;   call retrace
  310.                call flipsdelta
  311.                call UPDATEWORLD  ;movements/action scripts
  312.             ;   call umorp       ;update morph pointers
  313.                xor byte ptr cs:[flipflop],255
  314.                ret
  315. ;---------------------------------------------------------------
  316. WORLDINIT:    push cs
  317.               pop ds
  318.               mov bx,word ptr ds:[worldxangle]      ;start matrix calculation
  319.               mov si,word ptr ds:[worldyangle]
  320.               mov di,word ptr ds:[worldzangle]
  321.               add bx,bx
  322.               add si,si
  323.               add di,di
  324.  
  325.             mov bp,word ptr ds:[sine+bx]
  326.             mov bx,word ptr ds:[cose+bx]
  327.             mov ax,word ptr ds:[cose+si]
  328.             mov word ptr ds:[coy],ax
  329.             mov si,word ptr ds:[sine+si]
  330.             mov ax,word ptr ds:[sine+di]
  331.             mov word ptr ds:[siz],ax
  332.             mov di,word ptr ds:[cose+di]
  333.  
  334.             mov ax,word ptr ds:[coy]
  335.             imul di
  336.             mov al,ah
  337.             mov ah,dl
  338.             mov word ptr ds:[wphase1+1],ax
  339.             mov ax,si
  340.             imul di
  341.             mov al,ah
  342.             mov ah,dl
  343.             imul bp
  344.             mov cl,ah
  345.             mov ch,dl
  346.             mov ax,word ptr ds:[siz]
  347.             imul bx
  348.             mov al,ah
  349.             mov ah,dl
  350.             add ax,cx
  351.             mov word ptr ds:[wphase2+1],ax
  352.             mov ax,si
  353.             imul di
  354.             mov al,ah
  355.             mov ah,dl
  356.             imul bx
  357.             mov cl,ah
  358.             mov ch,dl
  359.             mov ax,word ptr ds:[siz]
  360.             imul bp
  361.             mov al,ah
  362.             mov ah,dl
  363.             sub ax,cx
  364.             mov word ptr ds:[wphase3+1],ax
  365.  
  366.             mov ax,word ptr ds:[siz]
  367.             neg ax
  368.             imul word ptr ds:[coy]
  369.             mov al,ah
  370.             mov ah,dl
  371.             mov word ptr ds:[wphase4+1],ax
  372.             mov ax,word ptr ds:[siz]
  373.             imul si
  374.             mov al,ah
  375.             mov ah,dl
  376.             imul bp
  377.             mov cl,ah
  378.             mov ch,dl
  379.             mov ax,bx
  380.             imul di
  381.             mov al,ah
  382.             mov ah,dl
  383.             sub ax,cx
  384.             mov word ptr ds:[wphase5+1],ax
  385.  
  386.             mov ax,word ptr ds:[siz]
  387.             imul si
  388.             mov al,ah
  389.             mov ah,dl
  390.             imul bx
  391.             mov al,ah
  392.             mov ah,dl
  393.             mov cx,ax
  394.             mov ax,bp
  395.             imul di
  396.             mov al,ah
  397.             mov ah,dl
  398.             add ax,cx
  399.             mov word ptr ds:[wphase6+1],ax
  400.  
  401.             mov ax,si
  402.             mov word ptr ds:[wphase7+1],ax
  403.             mov ax,word ptr ds:[coy]
  404.             neg ax
  405.             imul bp
  406.             mov al,ah
  407.             mov ah,dl
  408.             mov word ptr ds:[wphase8+1],ax
  409.             mov ax,word ptr ds:[coy]
  410.             imul bx
  411.             mov al,ah
  412.             mov ah,dl
  413.             mov word ptr ds:[wphase9+1],ax
  414.             mov ax,word ptr ds:[wphase1+1]            ;constants
  415.             mov bx,word ptr ds:[wphase2+1]            ;for 6-mul system
  416.             imul bx
  417.             mov al,ah
  418.             mov ah,dl
  419.             mov word ptr ds:[wcp1+1],ax
  420.             mov ax,word ptr ds:[wphase4+1]            ;constants
  421.             mov bx,word ptr ds:[wphase5+1]            ;for 6-mul system
  422.             imul bx
  423.             mov al,ah
  424.             mov ah,dl
  425.             mov word ptr ds:[wcp2+1],ax
  426.             mov ax,word ptr ds:[wphase7+1]            ;constants
  427.             mov bx,word ptr ds:[wphase8+1]            ;for 6-mul system
  428.             imul bx
  429.             mov al,ah
  430.             mov ah,dl
  431.             mov word ptr ds:[wcp3+1],ax
  432.             mov ax,word ptr ds:[viewpointx]
  433.             imul word ptr ds:[viewpointy]
  434.             mov al,ah
  435.             mov ah,dl
  436.             mov word ptr ds:[viewpointxy],ax
  437.             ret
  438.  
  439. WORLDHANDLE:
  440.             push cs
  441.             pop ds
  442.             mov bx,word ptr ds:[swap]
  443.             shl bx,5                       ;32 bytes/object 16 data, 16 swap
  444.             add bx,offset world+2
  445.             mov ax,word ptr ds:[bx+2]      ;object.in.world.xpos
  446.             mov cx,word ptr ds:[bx+4]
  447.             imul cx                        ;object.in.world.ypos
  448.             mov al,ah
  449.             mov ah,dl
  450.             mov di,ax     ;object.in.world.xypos
  451.             add di,word ptr ds:[viewpointxy]
  452.             cmp byte ptr ds:[bx+1],255
  453.             je @INDEPENDENT
  454.             mov eax,dword ptr ds:[worldxangle]
  455.             mov dword ptr ds:[bx+16+10],eax
  456.             mov ax,word ptr ds:[worldzangle]
  457.             mov word ptr ds:[bx+16+14],ax
  458.             jmp @SETOK
  459.             @INDEPENDENT:
  460.             mov eax,dword ptr ds:[bx+10]    ;object.in.world.angle.x
  461.             mov dword ptr ds:[bx+16+10],eax
  462.             mov ax,word ptr ds:[bx+14]      ;object.in.world.angle.x
  463.             mov word ptr ds:[bx+16+14],ax
  464.             @SETOK:
  465.             mov bp,word ptr ds:[bx+6]       ;bp=object.in.world.z
  466.             add bp,word ptr ds:[viewpointz]
  467.             mov cx,word ptr ds:[bx+4]       ;cx=object.in.world.y
  468.             add cx,word ptr ds:[viewpointy]
  469.             mov si,word ptr ds:[bx+2]       ;si=object.in.world.x
  470.             add si,word ptr ds:[viewpointx]
  471.  
  472. wPHASE2:    mov ax,999
  473.             add ax,si
  474. wPHASE1:    mov dx,666
  475.             add dx,cx
  476.             imul dx
  477.             mov bl,ah
  478.             mov bh,dl
  479.             sub bx,di
  480. wPHASE3:    mov ax,666;word ptr cs:[r13]
  481.             imul bp
  482.             mov al,ah
  483.             mov ah,dl
  484.             add ax,bx
  485. wCP1:       sub ax,666
  486.             mov word ptr ds:[WXA+1],ax
  487. wPHASE5:    mov ax,999;word ptr cs:[r12]
  488.             add ax,si                  ;X+A
  489. wPHASE4:    mov dx,666;word ptr cs:[r11]   ;Y+B
  490.             add dx,cx
  491.             imul dx                    ;(X+A)*(Y+B)
  492.             mov bl,ah
  493.             mov bh,dl
  494.             sub bx,di                  ;vertex.xy
  495. wPHASE6:    mov ax,666;word ptr cs:[r13]
  496.             imul bp
  497.             mov al,ah
  498.             mov ah,dl
  499. wCP2:       sub ax,666
  500.             add ax,bx
  501.             mov word ptr ds:[WYA+1],ax
  502. wPHASE8:    mov ax,999;word ptr cs:[r12]
  503.             add ax,si
  504. wPHASE7:    mov dx,666;word ptr cs:[r11]
  505.             add dx,cx
  506.             imul dx
  507.             mov bl,ah
  508.             mov bh,dl
  509.             sub bx,di
  510. wPHASE9:    mov ax,666;word ptr cs:[r13]
  511.             imul bp
  512.             mov al,ah
  513.             mov ah,dl
  514. wCP3:       sub ax,666
  515.             add ax,bx
  516.             mov dx,ax
  517.             mov bx,word ptr ds:[swap]
  518.             mov cx,bx
  519.             shl bx,5
  520.             add bx,offset world+18
  521.             mov ax,word ptr ds:[cameraxpos]
  522. WXA:        add ax,6666
  523.             mov word ptr ds:[bx+2],ax
  524.             mov ax,word ptr ds:[cameraypos]
  525. WYA:        add ax,7777
  526.             mov word ptr ds:[bx+4],ax
  527.             mov ax,word ptr ds:[camerazpos]
  528.             add ax,dx
  529.             mov word ptr ds:[bx+6],ax
  530.             mov bx,cx
  531.             add bx,bx
  532.             add bx,bx
  533.             add bx,offset sortti2
  534.             mov word ptr ds:[bx],ax   ;object z      to sort table
  535.             mov word ptr ds:[bx+2],cx ;object number to sort table
  536.             ret
  537. ;--------------------------------------------------------------------
  538. setobject:
  539.             push cs
  540.             pop ds
  541.             mov si,word ptr ds:[swap]  ;object number
  542.             add si,si
  543.             add si,si
  544.             mov bx,word ptr ds:[sortti2+si+2]
  545.             shl bx,5
  546.             movzx ax,byte ptr ds:[world+2+bx] ;object type
  547.             mov word ptr ds:[tempobj],ax      ;save the type for later use
  548.             mov si,ax
  549.             add si,si
  550.             add si,si
  551.             mov eax,dword ptr ds:[elementxms+si]
  552.             mov dword ptr ds:[objectxms],eax
  553.             mov eax,dword ptr ds:[elementenvxms+si]
  554.             mov dword ptr ds:[envbufxms],eax
  555.             add bx,offset world+18 ;BX is now pointer to current object
  556.             mov ax,word ptr ds:[bx+2]      ;objectxpos
  557.             mov word ptr ds:[WX+1],ax
  558.             mov ax,word ptr ds:[bx+4]      ;objectypos
  559.             mov word ptr ds:[WY+1],ax
  560.             mov ax,word ptr ds:[bx+6]      ;objectzpos
  561.             mov word ptr ds:[WZ+1],ax
  562.             mov ax,word ptr ds:[bx+10]     ;objectxangle
  563.             mov word ptr ds:[TAX+1],ax
  564.             mov ax,word ptr ds:[bx+12]     ;objectyangle
  565.             mov word ptr ds:[TAY+1],ax
  566.             mov ax,word ptr ds:[bx+14]     ;objectzangle
  567.             mov word ptr ds:[TAZ+1],ax
  568.             ret
  569. ;---------------------------------------------------------------------
  570. updateworld:
  571.                push cs
  572.                pop ds
  573.                sub word ptr ds:[worldyangle],8
  574.                cmp word ptr ds:[worldyangle],0
  575.                jge OKAY
  576.                mov word ptr ds:[worldyangle],1023
  577.                OKAY:
  578.                mov ax,word ptr ds:[worldxangle]
  579.                mov word ptr ds:[world+34+10],ax
  580.                mov ax,word ptr ds:[worldzangle]
  581.                mov word ptr ds:[world+34+14],ax
  582.                sub word ptr ds:[world+34+12],8
  583.                cmp word ptr ds:[world+34+12],0
  584.                jge OKAY2
  585.                mov word ptr ds:[world+34+12],1023
  586.                OKAY2:
  587.                add word ptr ds:[worldzangle],8
  588.                cmp word ptr ds:[worldzangle],1023
  589.                jna OKAY3
  590.                mov word ptr ds:[worldzangle],0
  591.                OKAY3:
  592.                mov bx,word ptr ds:[worldzangle]
  593.                add bx,bx
  594.                mov ax,word ptr ds:[sine+bx]
  595.                shl ax,4
  596.                add ax,8500
  597.                mov word ptr ds:[camerazpos],ax
  598.                ret
  599.  
  600. ;---------------------------------------------------------------------------
  601. umorp:        push cs                        ;simple morph adders
  602.               pop ds
  603.               mov ax,word ptr ds:[madd]
  604.               add word ptr ds:[mframe],ax
  605.               cmp word ptr ds:[mframe],260
  606.               jne @QUIT1
  607.               mov word ptr ds:[madd],-4
  608.               mov word ptr ds:[mframe],252
  609.               @QUIT1:
  610.               cmp word ptr ds:[mframe],-4
  611.               jne @QUIT2
  612.               mov word ptr ds:[mframe],4
  613.               mov word ptr ds:[madd],4
  614.               @QUIT2:
  615.               ret
  616. ;---------------------------------------------------------------------------
  617. morph:                                          ;not optimized
  618.             mov ax,0
  619.             mov ds,ax
  620.             mov bx,word ptr cs:[transformers]
  621.             add bx,bx
  622.             add bx,bx
  623.             mov esi,dword ptr cs:[elementxms+bx]  ;pointer to element
  624.             movzx eax,word ptr ds:[esi]           ;face amount
  625.             movzx edx,word ptr ds:[esi+2]         ;vertex amount
  626.             shl eax,5
  627.             add eax,4
  628.             add esi,eax                   ;esi=ptr to dest object
  629.             mov ecx,eax
  630.             shl edx,3
  631.             add edx,esi                   ;edx is=end ptr to object dest
  632.             mov dword ptr cs:[modi+3],edx
  633.  
  634.             mov bx,word ptr cs:[transformers+2]
  635.             add bx,bx
  636.             add bx,bx
  637.             mov ebp,dword ptr cs:[elementxms+bx]  ;pointer to element
  638.  
  639.             mov bx,word ptr cs:[transformers+4]
  640.             add bx,bx
  641.             add bx,bx
  642.             mov eax,dword ptr cs:[elementxms+bx]  ;pointer to element
  643.             sub eax,ebp
  644.             mov dword ptr cs:[SR2+3],eax
  645.             mov dword ptr cs:[SR3+3],eax
  646.             mov dword ptr cs:[SR4+3],eax
  647.             add ebp,ecx
  648.             mov di,word ptr cs:[mframe]  ;di=frame for ob1
  649.             mov cx,256
  650.             sub cx,di                    ;cx=frame for ob2
  651.             xchg ebp,esi
  652. @MP:
  653.             mov ax,word ptr ds:[esi]
  654.             imul cx
  655.             mov bh,dl
  656.             mov bl,ah
  657. SR2:        mov ax,word ptr ds:[esi+44332211h]
  658.             imul di
  659.             mov al,ah
  660.             mov ah,dl
  661.             add ax,bx
  662.             mov word ptr ds:[ebp],ax       ;new x
  663.             push ax
  664.             add ebp,2
  665.             add esi,2
  666.             mov ax,word ptr ds:[esi]
  667.             imul cx
  668.             mov bh,dl
  669.             mov bl,ah
  670. SR3:        mov ax,word ptr ds:[esi+44332211h]
  671.             imul di
  672.             mov al,ah
  673.             mov ah,dl
  674.             add ax,bx
  675.             mov word ptr ds:[ebp],ax       ;new y
  676.             push ax
  677.             add ebp,2
  678.             add esi,2
  679.             mov ax,word ptr ds:[esi]
  680.             imul cx
  681.             mov bh,dl
  682.             mov bl,ah
  683. SR4:        mov ax,word ptr ds:[esi+44332211h]
  684.             imul di
  685.             mov al,ah
  686.             mov ah,dl
  687.             add ax,bx
  688.             mov word ptr ds:[ebp],ax       ;new z
  689.             add ebp,2
  690.             add esi,2
  691.             pop ax
  692.             pop dx
  693.             imul dx
  694.             mov al,ah
  695.             mov ah,dl
  696.             mov word ptr ds:[ebp],ax
  697.             add ebp,2
  698.             add esi,2
  699. MODI:       cmp ebp,44332211h   ;for perfect morph we should
  700.             jne @MP             ;recalculate also normals
  701.            ret                  ;Just a vertex morph.....
  702.  
  703.  
  704. ;------------------------------------------------------------------
  705. rotate:      push cs
  706.              pop ds
  707.              xor ax,ax
  708.              mov es,ax
  709.  
  710. TAX:        mov bx,4545      ;start matrix calculation
  711. TAY:        mov si,4545
  712. TAZ:        mov di,4545
  713.             add bx,bx
  714.             add si,si
  715.             add di,di
  716.             mov bp,word ptr ds:[sine+bx]
  717.             mov bx,word ptr ds:[cose+bx]
  718.             mov ax,word ptr ds:[cose+si]
  719.             mov word ptr ds:[coy],ax
  720.             mov si,word ptr ds:[sine+si]
  721.             mov ax,word ptr ds:[sine+di]
  722.             mov word ptr ds:[siz],ax
  723.             mov di,word ptr ds:[cose+di]
  724.             mov ax,word ptr ds:[coy]
  725.             imul di
  726.             mov al,ah
  727.             mov ah,dl
  728.             mov word ptr ds:[phase1+1],ax
  729.             mov word ptr ds:[vrphase1+1],ax
  730.             mov word ptr ds:[vrphase1b+1],ax
  731.             mov word ptr ds:[vrphase1c+1],ax
  732.             mov ax,si
  733.             imul di
  734.             mov al,ah
  735.             mov ah,dl
  736.             imul bp
  737.             mov cl,ah
  738.             mov ch,dl
  739.             mov ax,word ptr ds:[siz]
  740.             imul bx
  741.             mov al,ah
  742.             mov ah,dl
  743.             add ax,cx
  744.             mov word ptr ds:[phase2+1],ax
  745.             mov word ptr ds:[vrphase2+1],ax
  746.             mov word ptr ds:[vrphase2b+1],ax
  747.             mov word ptr ds:[vrphase2c+1],ax
  748.             mov ax,si
  749.             imul di
  750.             mov al,ah
  751.             mov ah,dl
  752.             imul bx
  753.             mov cl,ah
  754.             mov ch,dl
  755.             mov ax,word ptr ds:[siz]
  756.             imul bp
  757.             mov al,ah
  758.             mov ah,dl
  759.             sub ax,cx
  760.             mov word ptr ds:[phase3+1],ax
  761.             mov word ptr ds:[vrphase3+1],ax
  762.             mov word ptr ds:[vrphase3b+1],ax
  763.             mov word ptr ds:[vrphase3c+1],ax
  764.  
  765.             mov ax,word ptr ds:[siz]
  766.             neg ax
  767.             imul word ptr ds:[coy]
  768.             mov al,ah
  769.             mov ah,dl
  770.             mov word ptr ds:[phase4+1],ax
  771.             mov word ptr ds:[vrphase4+1],ax
  772.             mov word ptr ds:[vrphase4b+1],ax
  773.             mov word ptr ds:[vrphase4c+1],ax
  774.  
  775.             mov ax,word ptr ds:[siz]
  776.             imul si
  777.             mov al,ah
  778.             mov ah,dl
  779.             imul bp
  780.             mov cl,ah
  781.             mov ch,dl
  782.             mov ax,bx
  783.             imul di
  784.             mov al,ah
  785.             mov ah,dl
  786.             sub ax,cx
  787.             mov word ptr ds:[phase5+1],ax
  788.             mov word ptr ds:[vrphase5+1],ax
  789.             mov word ptr ds:[vrphase5b+1],ax
  790.             mov word ptr ds:[vrphase5c+1],ax
  791.  
  792.             mov ax,word ptr ds:[siz]
  793.             imul si
  794.             mov al,ah
  795.             mov ah,dl
  796.             imul bx
  797.             mov al,ah
  798.             mov ah,dl
  799.             mov cx,ax
  800.             mov ax,bp
  801.             imul di
  802.             mov al,ah
  803.             mov ah,dl
  804.             add ax,cx
  805.             mov word ptr ds:[phase6+1],ax
  806.             mov word ptr ds:[vrphase6+1],ax
  807.             mov word ptr ds:[vrphase6b+1],ax
  808.             mov word ptr ds:[vrphase6c+1],ax
  809.  
  810.             mov ax,si
  811.             mov word ptr ds:[phase7+1],ax
  812.             mov word ptr ds:[lbl1+2],ax
  813.             mov ax,word ptr ds:[coy]
  814.             neg ax
  815.             imul bp
  816.             mov al,ah
  817.             mov ah,dl
  818.             mov word ptr ds:[phase8+1],ax
  819.             mov word ptr ds:[lbl2+1],ax
  820.             mov ax,word ptr ds:[coy]
  821.             imul bx
  822.             mov al,ah
  823.             mov ah,dl
  824.             mov word ptr ds:[phase9+1],ax     ;matrix is calculated now
  825.             mov word ptr ds:[lbl3+1],ax
  826.             mov edi,dword ptr ds:[objectxms]  ;absolute ptr to obj.data in XMS
  827.             movzx eax,word ptr es:[edi]       ;face amount
  828.             shl eax,5
  829.             add eax,edi
  830.             add eax,4
  831.             mov dword ptr ds:[p0+3],eax        ;32bit offset is here added
  832.             add eax,2
  833.             mov dword ptr ds:[p2+3],eax
  834.             add eax,2
  835.             mov dword ptr ds:[p4+3],eax
  836.             add eax,2
  837.             mov dword ptr ds:[p9+3],eax
  838.             movzx eax,word ptr es:[edi+2]      ;vertex amount
  839.             shl eax,3
  840.             mov dword ptr ds:[offset comp+3],eax
  841.             mov ax,word ptr ds:[xpos2d]
  842.             mov word ptr ds:[xp+1],ax
  843.             mov ax,word ptr ds:[ypos2d]
  844.             mov word ptr ds:[yp+1],ax
  845.             mov ax,word ptr ds:[phase1+1]      ;constants
  846.             mov bx,word ptr ds:[phase2+1]      ;for 6-mul system
  847.             imul bx
  848.             mov al,ah
  849.             mov ah,dl
  850.             sub word ptr ds:[WX+1],ax
  851.             mov word ptr ds:[vrcp1+1],ax
  852.             mov word ptr ds:[vrcp1b+1],ax
  853.             mov word ptr ds:[vrcp1c+1],ax
  854.             mov ax,word ptr ds:[phase4+1]            ;constants
  855.             mov bx,word ptr ds:[phase5+1]            ;for 6-mul system
  856.             imul bx
  857.             mov al,ah
  858.             mov ah,dl
  859.             sub word ptr ds:[WY+1],ax
  860.             mov word ptr ds:[vrcp2+1],ax
  861.             mov word ptr ds:[vrcp2b+1],ax
  862.             mov word ptr ds:[vrcp2c+1],ax
  863.             mov ax,word ptr ds:[phase7+1]            ;constants
  864.             mov bx,word ptr ds:[phase8+1]            ;for 6-mul system
  865.             imul bx
  866.             mov al,ah
  867.             mov ah,dl
  868.             sub word ptr ds:[WZ+1],ax
  869.             mov word ptr ds:[hidden+2],ax
  870.             mov eax,dword ptr cs:[projectionbuffer] ;pointer to matrix
  871.             mov dword ptr ds:[putx+3],eax
  872.             add eax,2
  873.             mov dword ptr ds:[puty+3],eax
  874.             add eax,2
  875.             mov dword ptr ds:[putz+3],eax
  876.             xor edi,edi                  ;relative ptr to obj.vertex.data
  877.             mov ax,0
  878.             mov ds,ax
  879. RTMAIN:                                           ;rotate & 2d transform
  880.  
  881.             push di
  882.      P4:    mov bp,word ptr ds:[edi+44332211h]      ;bp=vertex.z
  883.      P2:    mov cx,word ptr ds:[edi+44332211h]      ;cx=vertex.y
  884.      P0:    mov si,word ptr ds:[edi+44332211h]      ;si=vertex.x
  885.      P9:    mov di,word ptr ds:[edi+44332211h]      ;fs=vertex.y
  886.  
  887. PHASE2:     mov ax,999
  888.             add ax,si
  889. PHASE1:     mov dx,666
  890.             add dx,cx
  891.             imul dx
  892.             mov bl,ah
  893.             mov bh,dl
  894.             sub bx,di
  895. PHASE3:     mov ax,666
  896.             imul bp
  897.             mov al,ah
  898.             mov ah,dl
  899.             add ax,bx
  900. WX:         add ax,6666
  901.             mov word ptr cs:[xmod+1],ax
  902. PHASE5:     mov ax,999
  903.             add ax,si
  904. PHASE4:     mov dx,666
  905.             add dx,cx
  906.             imul dx
  907.             mov bl,ah
  908.             mov bh,dl
  909.             sub bx,di
  910. PHASE6:     mov ax,666
  911.             imul bp
  912.             mov al,ah
  913.             mov ah,dl
  914.             add ax,bx
  915. WY:         add ax,6666
  916.             mov word ptr cs:[res2+1],ax
  917. PHASE8:     mov ax,999
  918.             add ax,si
  919. PHASE7:     mov dx,666
  920.             add dx,cx
  921.             imul dx
  922.             mov bl,ah
  923.             mov bh,dl
  924.             sub bx,di
  925. PHASE9:     mov ax,666;word ptr cs:[r13]
  926.             imul bp
  927.             mov al,ah
  928.             mov ah,dl
  929. WZ:         add ax,7777
  930.             add bx,ax
  931.             pop di
  932. PUTZ:       mov word ptr ds:[edi+4+(44332211h)],bx
  933.       XMOD: mov ax,9999
  934.             cwd
  935.             mov dl,ah
  936.             mov ah,al
  937.          ;   xor al,al   ;no need becoz 0..255 div 256+ is zero....bx>255
  938.             idiv bx
  939.       XP:   add ax,1995
  940. PUTX:       mov word ptr ds:[edi+(44332211h)],ax
  941.       RES2: mov ax,666
  942.             cwd
  943.             mov dl,ah
  944.             mov ah,al
  945.          ;   xor al,al   ;no need becoz 0..255 div 256+ is zero....bx>255
  946.             idiv bx
  947.         YP: add ax,653
  948. PUTY:       mov word ptr ds:[edi+2+(44332211h)],ax
  949.            SKIP:
  950.             add edi,8      ;wasting memory one word/vertex for faster access
  951.       COMP: cmp edi,44332211h
  952.             jne RTMAIN
  953.             ret
  954.  
  955. ;------------------------------------------------------------
  956. environment:
  957.               push gs
  958.               push es
  959.               push ds
  960.               mov ax,0
  961.               mov ds,ax
  962.               xor ebp,ebp
  963.               mov eax,dword ptr cs:[sorttixms]
  964.               add eax,2
  965.               mov dword ptr cs:[fc-4],eax
  966.               mov eax,dword ptr cs:[envbufxms]
  967.               mov dword ptr cs:[fc2c-4],eax
  968.               mov dword ptr cs:[fc3c-4],eax
  969.               mov dword ptr cs:[fc4c-4],eax
  970.               add eax,2
  971.               mov dword ptr cs:[fc2b-4],eax
  972.               mov dword ptr cs:[fc3b-4],eax
  973.               mov dword ptr cs:[fc4b-4],eax
  974.               add eax,2
  975.               mov dword ptr cs:[fc2a-4],eax
  976.               mov dword ptr cs:[fc3a-4],eax
  977.               mov dword ptr cs:[fc4a-4],eax
  978.               add eax,2
  979.               mov dword ptr cs:[fc2d-4],eax
  980.               mov dword ptr cs:[fc3d-4],eax
  981.               mov dword ptr cs:[fc4d-4],eax
  982.  
  983.               add dword ptr cs:[fc4c-4],16
  984.               add dword ptr cs:[fc4b-4],16
  985.               add dword ptr cs:[fc4a-4],16
  986.               add dword ptr cs:[fc4d-4],16
  987.               add dword ptr cs:[fc3c-4],8
  988.               add dword ptr cs:[fc3b-4],8
  989.               add dword ptr cs:[fc3a-4],8
  990.               add dword ptr cs:[fc3d-4],8
  991.  
  992.               mov eax,dword ptr cs:[objectxms]
  993.               add eax,16
  994.               mov dword ptr cs:[fc3+3],eax
  995.               mov ax,word ptr cs:[facecount]
  996.               mov bp,ax
  997.               dec bp
  998.           ;    mov word ptr cs:[fc5+2],ax
  999. @vrFACESLEFT:
  1000.               xor edi,edi
  1001.               mov di,word ptr ds:[ebp*4+11223344h]  ;get the face number
  1002.           fc: mov ebx,edi
  1003.               shl ebx,3
  1004.               lea ebx,[ebx*2+ebx]               ;multiply by 24
  1005.               shl edi,5                         ;32 bytes data per face
  1006.          fc3: add edi,11223344h
  1007.               push bp
  1008.               mov word ptr ds:[0],bx   ;
  1009.               push di                  ;who cares about int 0 vector...
  1010.                  mov di,word ptr ds:[ebx+11223344h]
  1011.         fc2a:    mov cx,word ptr ds:[ebx+11223344h]
  1012.         fc2b:    mov si,word ptr ds:[ebx+11223344h]
  1013.         fc2c:    mov bp,word ptr ds:[ebx+11223344h]
  1014.         fc2d:
  1015. vrPHASE2:   mov ax,999
  1016.             add ax,si
  1017. vrPHASE1:   mov dx,666
  1018.             add dx,cx
  1019.             imul dx
  1020.             mov bl,ah
  1021.             mov bh,dl
  1022.             sub bx,bp
  1023. vrPHASE3:   mov ax,666
  1024.             imul di
  1025.             mov al,ah
  1026.             mov ah,dl
  1027.             add ax,bx
  1028. vrCP1:      sub ax,666
  1029.             sar ax,1
  1030.             xor ah,ah
  1031.             mov dx,ax
  1032. vrPHASE5:   mov ax,999
  1033.             add ax,si
  1034.             mov si,dx
  1035. vrPHASE4:   mov dx,666
  1036.             add dx,cx
  1037.             imul dx
  1038.             mov bl,ah
  1039.             mov bh,dl
  1040.             sub bx,bp
  1041. vrPHASE6:   mov ax,666
  1042.             imul di
  1043.             mov al,ah
  1044.             mov ah,dl
  1045.             add ax,bx
  1046. vrCP2:      sub ax,666
  1047.             pop di
  1048.             shl ax,7     ;ah=(al sar 1).......
  1049.             xor al,al
  1050.             or  ax,si
  1051.             add ax,8080h
  1052.             mov word ptr ds:[edi],ax
  1053.             mov bx,word ptr ds:[0]
  1054.             push di
  1055.             mov di,word ptr ds:[ebx+11223344h]
  1056.       fc3a: mov cx,word ptr ds:[ebx+11223344h]
  1057.       fc3b: mov si,word ptr ds:[ebx+11223344h]
  1058.       fc3c: mov bp,word ptr ds:[ebx+11223344h]
  1059.       fc3d:
  1060.  
  1061. vrPHASE2b:  mov ax,999
  1062.             add ax,si
  1063. vrPHASE1b:  mov dx,666
  1064.             add dx,cx
  1065.             imul dx
  1066.             mov bl,ah
  1067.             mov bh,dl
  1068.             sub bx,bp
  1069. vrPHASE3b:  mov ax,666
  1070.             imul di
  1071.             mov al,ah
  1072.             mov ah,dl
  1073.             add ax,bx
  1074. vrCP1b:     sub ax,666
  1075.             sar ax,1
  1076.             xor ah,ah
  1077.             mov dx,ax
  1078. vrPHASE5b:  mov ax,999
  1079.             add ax,si
  1080.             mov si,dx
  1081. vrPHASE4b:  mov dx,666
  1082.             add dx,cx
  1083.             imul dx
  1084.             mov bl,ah
  1085.             mov bh,dl
  1086.             sub bx,bp
  1087. vrPHASE6b:  mov ax,666
  1088.             imul di
  1089.             mov al,ah
  1090.             mov ah,dl
  1091.             add ax,bx
  1092. vrCP2b:     sub ax,666
  1093.             pop di
  1094.             shl ax,7
  1095.             xor al,al
  1096.             or  ax,si
  1097.             add ax,8080h
  1098.             mov word ptr ds:[edi+2],ax
  1099.             mov bx,word ptr ds:[0]
  1100.             push di
  1101.              mov di,word ptr ds:[ebx+11223344h]
  1102.        fc4a: mov cx,word ptr ds:[ebx+11223344h]
  1103.        fc4b: mov si,word ptr ds:[ebx+11223344h]
  1104.        fc4c: mov bp,word ptr ds:[ebx+11223344h]
  1105.        fc4d:
  1106.  
  1107. vrPHASE2c:  mov ax,999
  1108.             add ax,si
  1109. vrPHASE1c:  mov dx,666
  1110.             add dx,cx
  1111.             imul dx
  1112.             mov bl,ah
  1113.             mov bh,dl
  1114.             sub bx,bp
  1115. vrPHASE3c:  mov ax,666
  1116.             imul di
  1117.             mov al,ah
  1118.             mov ah,dl
  1119.             add ax,bx
  1120. vrCP1c:     sub ax,666
  1121.             sar ax,1
  1122.             xor ah,ah
  1123.             mov dx,ax
  1124. vrPHASE5c:  mov ax,999
  1125.             add ax,si
  1126.             mov si,dx
  1127. vrPHASE4c:  mov dx,666
  1128.             add dx,cx
  1129.             imul dx
  1130.             mov bl,ah
  1131.             mov bh,dl
  1132.             sub bx,bp
  1133. vrPHASE6c:  mov ax,666
  1134.             imul di
  1135.             mov al,ah
  1136.             mov ah,dl
  1137.             add ax,bx
  1138. vrCP2c:     sub ax,666
  1139.             pop di
  1140.             shl ax,7
  1141.             xor al,al
  1142.             or  ax,si
  1143.             add ax,8080h
  1144.             mov word ptr ds:[edi+4],ax         ;14
  1145.             pop bp
  1146.             sub bp,1
  1147.             jnc @vrFACESLEFT
  1148.             pop ds
  1149.             pop es
  1150.             pop gs
  1151.             ret
  1152. ; ---------------------------------------------------------------
  1153. RETRACE:
  1154.                 mov dx,3dah
  1155. AGAIN1:         in al,dx
  1156.                 and al,08h
  1157.                 jnz AGAIN1
  1158. AGAIN2:         in al,dx
  1159.                 and al,08h
  1160.                 jz AGAIN2
  1161.                 ret
  1162.  
  1163. ;-------------------------------------------------------------------
  1164. exit:
  1165.  
  1166.        push cs
  1167.        pop ds
  1168.        cmp byte ptr ds:[errr],2
  1169.        je @WASXMSerror
  1170.        cmp byte ptr ds:[errr],3
  1171.        je @WASXMSerror
  1172.        cmp byte ptr ds:[errr],7
  1173.        je @WASXMSerror
  1174.  
  1175.        call unlock
  1176.        call freexms
  1177.  @WASXMSerror:
  1178.        movzx dx,byte ptr ds:[errr]
  1179.        shl dx,4
  1180.        add dx,offset msg
  1181.        xor ax,ax
  1182.        mov ah,09h
  1183.        int 21h
  1184.        mov ax,4c00h
  1185.        int 21h
  1186. ;-------------------------------------------------------------------
  1187. copyright:
  1188.        push cs
  1189.        pop ds
  1190.        mov dx,offset title3
  1191.        xor ax,ax
  1192.        mov ah,09h
  1193.        int 21h
  1194.        mov dx,offset title2
  1195.        xor ax,ax
  1196.        mov ah,09h
  1197.        int 21h
  1198.        ret
  1199. ;--------------------------------------------------------------------
  1200. palette:
  1201.              mov al,0
  1202.              mov dx,03c8h
  1203.              out dx,al
  1204.              mov si,0
  1205.              mov dx,03c9h
  1206. MAINL:
  1207.              mov al,byte ptr cs:[si+10+pal]    ;phong.pal
  1208.              out dx,al
  1209.              mov al,byte ptr cs:[si+1+10+pal]
  1210.              out dx,al
  1211.              mov al,byte ptr cs:[si+2+10+pal]
  1212.              out dx,al
  1213.              add si,3
  1214.              cmp si,768
  1215.              jne MAINL
  1216.              ret
  1217. ;-------------------------------------------------------------------
  1218. initsortbuffer:
  1219.                 mov ebp,dword ptr cs:[projectionbuffer]
  1220.                 mov ax,0
  1221.                 mov ds,ax
  1222.                 mov word ptr cs:[facecount],0
  1223.                 xor cx,cx
  1224.                 mov edi,dword ptr cs:[sorttixms]
  1225.                 add ebp,4
  1226.                 mov dword ptr cs:[muu1-4],ebp
  1227.                 mov dword ptr cs:[muu2-4],ebp
  1228.                 mov dword ptr cs:[muu3-4],ebp
  1229.                 xor ebx,ebx
  1230.                 mov esi,dword ptr cs:[objectxms]
  1231.                 mov cx,word ptr ds:[esi]  ;face count
  1232.                 dec cx
  1233.                 add esi,4                 ;pointer to face begin of data
  1234.                 xor bp,bp
  1235. INITL:
  1236.             mov ax,word ptr ds:[esi+6]
  1237. LBL2:       add ax,6666
  1238.             mov dx,word ptr ds:[esi+8]
  1239. LBL1:       add dx,7777
  1240.             imul dx
  1241.             mov bl,ah
  1242.             mov bh,dl
  1243.             sub bx,word ptr ds:[esi+12+(3*6)]     ;facenormal.xy, weird stored.
  1244. HIDDEN:     sub bx,666
  1245. LBL3:       mov ax,666
  1246.             imul word ptr ds:[esi+10]
  1247.             mov al,ah
  1248.             mov ah,dl
  1249.             add ax,bx
  1250.             njs zCLIPPEDorHIDDEN
  1251.        ;     cmp ax,-20     ;hidden face remove angle, adjust this, if bugs
  1252.        ;     njng zCLIPPEDorHIDDEN   ;yeah, this bugs a lot
  1253.                 mov bx,word ptr ds:[esi]
  1254.                 mov dx,word ptr ds:[ebx*8+11223344h] ;rotated z
  1255.            MUU1:
  1256.                 mov bx,word ptr ds:[esi+2]
  1257.                 add dx,word ptr ds:[ebx*8+11223344h] ;rotated z
  1258.            MUU2:
  1259.                 mov bx,word ptr ds:[esi+4]
  1260.                 add dx,word ptr ds:[ebx*8+11223344h]   ;rotated z
  1261.            MUU3:mov word ptr ds:[edi],dx     ;first the z
  1262.                 mov word ptr ds:[edi+2],bp   ;then the face number
  1263.                 add edi,4
  1264.        ZCLIPPEDorHIDDEN:
  1265.                 add esi,32
  1266.                 inc bp
  1267.                 sub cx,1
  1268.                 jnc INITL
  1269.                 sub edi,cs:[sorttixms]
  1270.                 shr edi,2
  1271.                 mov word ptr cs:[facecount],di
  1272.                 ret
  1273. ;------------------------------------------------------------------------
  1274. align 2
  1275. count dw 260 dup (0)
  1276. bytesort:                        ;byte sort for faces....
  1277.          push cs
  1278.          pop ds
  1279.          xor eax,eax
  1280.          OFF=0
  1281.          rept 129
  1282.          mov dword ptr ds:[offset count+OFF],eax
  1283.          OFF=OFF+4
  1284.          endm
  1285.          xor ax,ax
  1286.          mov ds,ax
  1287.          mov eax,dword ptr cs:[sorttixms]
  1288.          mov dword ptr cs:[indexinxms],eax
  1289.          mov eax,dword ptr cs:[onearrayxms]
  1290.          mov dword ptr cs:[indexoutxms],eax
  1291.          mov ax,word ptr cs:[facecount]
  1292.          mov word ptr cs:[itemcount],ax
  1293.          mov word ptr cs:[bytenumber],0
  1294.          mov esi,dword ptr cs:[indexinxms]
  1295.          mov dx,0
  1296.          mov cx,word ptr cs:[itemcount]
  1297.          @bloop:
  1298.          mov bl,byte ptr ds:[esi]
  1299.          xor bh,bh
  1300.          inc bx
  1301.          add bx,bx
  1302.          inc word ptr cs:[bx+count]
  1303.          add esi,4
  1304.          sub cx,1
  1305.          jnc @bloop
  1306.          mov bx,offset count
  1307.          push ds
  1308.          push cs
  1309.          pop ds
  1310.          @cloop:
  1311.          mov ax,word ptr ds:[bx]
  1312.          add bx,2
  1313.          add word ptr ds:[bx],ax
  1314.          cmp bx,510 +offset count
  1315.          jna @cloop
  1316.          pop ds
  1317.          xor dx,dx
  1318.          xor ebx,ebx
  1319.          xor ecx,ecx
  1320.          mov edi,dword ptr cs:[indexinxms]
  1321.          mov eax,dword ptr cs:[indexoutxms]
  1322.          mov dword ptr cs:[sf2-4],eax
  1323.          mov bp,word ptr cs:[facecount]
  1324.          xor esi,esi
  1325.          @dloop:
  1326.          mov eax,dword ptr ds:[edi]
  1327.          mov bx,ax
  1328.          xor bh,bh
  1329.          add bx,bx
  1330.          mov si,word ptr cs:[bx+count]
  1331.          mov dword ptr ds:[esi*4+11223344h],eax
  1332.     SF2: inc word ptr cs:[bx+count]
  1333.          add edi,4
  1334.          sub bp,1
  1335.          jnc @dloop
  1336.          push cs
  1337.          pop ds
  1338.          xor eax,eax
  1339.          OFF=0
  1340.          rept 129
  1341.          mov dword ptr ds:[offset count+OFF],eax
  1342.          OFF=OFF+4
  1343.          endm
  1344.          mov eax,dword ptr cs:[onearrayxms]
  1345.          mov dword ptr cs:[indexinxms],eax
  1346.          mov eax,dword ptr cs:[sorttixms]
  1347.          mov dword ptr cs:[indexoutxms],eax
  1348.          mov ax,word ptr cs:[facecount]
  1349.          mov word ptr cs:[itemcount],ax
  1350.          mov word ptr cs:[bytenumber],8
  1351.          xor ax,ax
  1352.          mov ds,ax
  1353.          mov esi,dword ptr cs:[indexinxms]
  1354.          inc esi
  1355.          mov dx,0
  1356.          mov cx,word ptr cs:[itemcount]
  1357.          p@bloop:
  1358.          mov bl,byte ptr ds:[esi]
  1359.          xor bh,bh
  1360.          inc bx
  1361.          add bx,bx
  1362.          inc word ptr cs:[bx+count]
  1363.          add esi,4
  1364.          sub cx,1
  1365.          jnc p@bloop
  1366.  
  1367.         mov bx,offset count
  1368.         push ds
  1369.         push cs
  1370.         pop ds
  1371.         p@cloop:
  1372.         mov ax,word ptr ds:[bx]
  1373.         add bx,2
  1374.         add word ptr ds:[bx],ax
  1375.         cmp bx,510 +offset count
  1376.         jna p@cloop
  1377.         pop ds
  1378.         mov dx,0
  1379.         xor ebx,ebx
  1380.         xor ecx,ecx
  1381.         mov edi,dword ptr cs:[indexinxms]
  1382.         mov eax,dword ptr cs:[indexoutxms]
  1383.         mov dword ptr cs:[sf3-4],eax
  1384.         mov bp,word ptr cs:[facecount]
  1385.         xor esi,esi
  1386.         p@dloop:
  1387.         mov eax,dword ptr ds:[edi]
  1388.         mov bl,ah
  1389.         xor bh,bh
  1390.         add bx,bx
  1391.         mov si,word ptr cs:[bx+count]
  1392.         mov dword ptr ds:[esi*4+11223344h],eax
  1393.    SF3: inc word ptr cs:[bx+count]
  1394.         add edi,4
  1395.         sub bp,1
  1396.         jnc p@dloop
  1397.         ret
  1398. ;----------------------------------------------------------------------------
  1399. sortobjects:                               ;bitsort for objects....
  1400.                 push es                    ;lazyness.....
  1401.                 push ds
  1402.                 push cs
  1403.                 pop ds
  1404.                 mov     ax,ds
  1405.                 mov     es,ax
  1406.                 cld
  1407.                 mov     dx,word ptr ds:[world]
  1408.                 shl     dx,2
  1409.                 add     dx,offset sortti2
  1410.         XOR    AX,AX
  1411.         MOV    byte ptr ds:[fcount],0
  1412.                 mov     bp,1
  1413. o@outloop:
  1414.                 mov     si,offset sortti2
  1415.                 mov     di,offset onearray2
  1416.                 mov     bx,offset zeroarray2
  1417.  
  1418. o@iloop:
  1419.         MOV    EAX,dword ptr ds:[SI]
  1420.         test    AX,bp
  1421.         JE    o@zeros
  1422.         MOV    dword ptr ds:[di],EAX
  1423.                 add     di,4
  1424.                 add     si,4
  1425.                 cmp     si,dx
  1426.                 jne     o@iloop
  1427.         JMP    oPdASS
  1428. o@zeros:
  1429.         MOV    dword ptr ds:[bx],eax
  1430.                 add     bx,4
  1431.                 add     si,4
  1432.         CMP    si,dx
  1433.                 jne o@iloop
  1434. oPdASS:
  1435.                 mov     cx,di
  1436.                 sub     cx,offset onearray2
  1437.                 shr     cx,2
  1438.                 mov     si,offset onearray2
  1439.                 mov     di,offset sortti2
  1440.                 o@okc:
  1441.                 or cx,cx
  1442.                 jz oNOTHISTIME
  1443.                 oalfa:
  1444.                 mov eax,dword ptr ds:[si]
  1445.                 mov dword ptr ds:[di],eax
  1446.                 add di,4
  1447.                 add si,4
  1448.                 dec cx
  1449.                 jnz oalfa
  1450.                 oNOTHISTIME:
  1451.                 mov     si,offset zeroarray2
  1452.                 mov     cx,bx
  1453.                 sub     cx,offset zeroarray2
  1454.                 shr     cx,2
  1455.                 or cx,cx
  1456.                 jz oNOTHISTIME2
  1457.                 oalfa2:
  1458.                 mov eax,dword ptr ds:[si]
  1459.                 mov dword ptr ds:[di],eax
  1460.                 add di,4
  1461.                 add si,4
  1462.                 dec cx
  1463.                 jnz oalfa2
  1464.                 oNOTHISTIME2:
  1465.         add    bp,bp
  1466.         inc    byte ptr ds:[fcount]
  1467.         CMP    byte ptr ds:[fcount],0FH
  1468.         Jng    o@outloop
  1469.                 pop ds
  1470.                 pop es
  1471.                 ret
  1472.  
  1473. ;---------------------------------------------------------------------------
  1474. prefix:
  1475.                mov word ptr cs:[swap],0
  1476.                mov eax,dword ptr cs:[envbufxms]
  1477.                mov dword ptr cs:[lastxms],eax
  1478.      MORETOFIX:
  1479.                push ds
  1480.                xor ax,ax
  1481.                mov ds,ax
  1482.                mov di,word ptr cs:[swap]
  1483.                add di,di
  1484.                add di,di
  1485.                mov esi,dword ptr cs:[elementxms+di]
  1486.                mov dword ptr cs:[objectxms],esi
  1487.                mov bp,word ptr ds:[esi]   ;bp=face amount
  1488.                mov ax,24                  ;24 bytes in env map per face
  1489.                mul bp
  1490.                movzx eax,ax
  1491.                add esi,4
  1492.                xor cx,cx
  1493.                mov ebx,dword ptr cs:[lastxms]
  1494.                mov dword ptr cs:[elementenvxms+di],ebx
  1495.                add dword ptr cs:[lastxms],eax
  1496.                MULL:
  1497.                mov ax,word ptr ds:[esi+6] ;face.normal.x
  1498.                mov di,word ptr ds:[esi+8] ;face.normal.y
  1499.                imul di
  1500.                mov al,ah
  1501.                mov ah,dl
  1502.                mov word ptr ds:[esi+12+(3*6)],ax
  1503.  
  1504.                mov ax,word ptr ds:[esi+16] ;vertex1.normal.z
  1505.                sar word ptr ds:[esi+16],1
  1506.                add word ptr ds:[esi+16],128
  1507.                mov word ptr ds:[ebx+4],ax
  1508.                mov ax,word ptr ds:[esi+12] ;vertex1.normal.x
  1509.                sar word ptr ds:[esi+12],1
  1510.                add word ptr ds:[esi+12],128
  1511.                mov word ptr ds:[ebx],ax
  1512.                mov di,word ptr ds:[esi+14] ;vertex1.normal.y
  1513.                sar word ptr ds:[esi+14],1
  1514.                add word ptr ds:[esi+14],128
  1515.                mov word ptr ds:[ebx+2],di
  1516.                imul di
  1517.                mov al,ah
  1518.                mov ah,dl
  1519.                mov word ptr ds:[ebx+6],ax
  1520.                add ebx,8
  1521.                mov ax,word ptr ds:[esi+22] ;vertex2.normal.z
  1522.                sar word ptr ds:[esi+22],1
  1523.                add word ptr ds:[esi+22],128
  1524.                mov word ptr ds:[ebx+4],ax
  1525.                mov ax,word ptr ds:[esi+18] ;vertex2.normal.x
  1526.                sar word ptr ds:[esi+18],1
  1527.                add word ptr ds:[esi+18],128
  1528.                mov word ptr ds:[ebx],ax
  1529.                mov di,word ptr ds:[esi+20] ;vertex2.normal.y
  1530.                sar word ptr ds:[esi+20],1
  1531.                add word ptr ds:[esi+20],128
  1532.                mov word ptr ds:[ebx+2],di
  1533.                imul di
  1534.                mov al,ah
  1535.                mov ah,dl
  1536.                mov word ptr ds:[ebx+6],ax
  1537.                add ebx,8
  1538.                mov ax,word ptr ds:[esi+28] ;vertex3.normal.z
  1539.                sar word ptr ds:[esi+28],1
  1540.                add word ptr ds:[esi+28],128
  1541.                mov word ptr es:[ebx+4],ax
  1542.                mov ax,word ptr ds:[esi+24] ;vertex3.normal.x
  1543.                sar word ptr ds:[esi+24],1
  1544.                add word ptr ds:[esi+24],128
  1545.  
  1546.                mov word ptr ds:[ebx],ax
  1547.                mov di,word ptr ds:[esi+26] ;vertex3.normal.y
  1548.                sar word ptr ds:[esi+26],1
  1549.                add word ptr ds:[esi+26],128
  1550.                mov word ptr ds:[ebx+2],di
  1551.                imul di
  1552.                mov al,ah
  1553.                mov ah,dl
  1554.                mov word ptr ds:[ebx+6],ax
  1555.                add ebx,8
  1556.                add esi,32
  1557.                inc cx
  1558.                cmp cx,bp
  1559.                jne MULL
  1560.                movzx eax,bp       ;face amount
  1561.                shl eax,5          ;per each face is 32 bytes
  1562.                add eax,4
  1563.                mov esi,dword ptr cs:[objectxms]
  1564.                mov di,word ptr ds:[esi+2]  ;di=vertex amount
  1565.                add esi,eax                 ;esi = begin of vertex data
  1566.                VMULL:
  1567.                mov ax,word ptr ds:[esi]   ;vertex.x
  1568.                mov bx,word ptr ds:[esi+2] ;vertex.y
  1569.                imul bx
  1570.                mov al,ah
  1571.                mov ah,dl
  1572.                mov word ptr ds:[esi+6],ax ;vertex.xy,
  1573.                add esi,8                  ; the converter doesn't do it.
  1574.                dec di
  1575.                jnz VMULL
  1576.                pop ds
  1577.                inc word ptr cs:[swap]
  1578.                mov ax,word ptr cs:[elements]
  1579.                cmp word ptr cs:[swap],ax
  1580.                jne MORETOFIX
  1581.                ret
  1582.  
  1583. ;---------------------------------------------------------------------------
  1584. txdrawpolys:
  1585.             xor ax,ax
  1586.             mov ds,ax
  1587.           ;  mov ax,seg loadbuffer
  1588.           ;  mov es,ax
  1589.             mov ax,seg dcc
  1590.             cmp byte ptr cs:[flipflop],1
  1591.             jne PASSSSSS
  1592.             mov ax,seg virtual
  1593.             PASSSSSS:
  1594.             mov es,ax
  1595.             jmp @WASDELTA
  1596.             @NORMALT:
  1597.             mov ax,seg virtual
  1598.             mov es,ax
  1599.             @WASDELTA:
  1600.             mov ecx,dword ptr cs:[sorttixms]
  1601.             mov dword ptr cs:[moo-4],ecx
  1602.             add dword ptr cs:[moo-4],2
  1603.             movzx eax,word ptr cs:[facecount]
  1604.             add eax,eax
  1605.             add eax,eax
  1606.             add ecx,eax
  1607.             sub ecx,4
  1608.             mov eax,dword ptr cs:[objectxms]
  1609.             add eax,16
  1610.             mov dword ptr cs:[mdr1+3],eax
  1611.             mov eax,dword ptr cs:[projectionbuffer]
  1612.             mov dword ptr cs:[mcr1-4],eax
  1613.             mov dword ptr cs:[mcr4-4],eax
  1614.             mov dword ptr cs:[mcr6-4],eax
  1615.             add eax,2
  1616.             mov dword ptr cs:[mcr2-4],eax
  1617.             mov dword ptr cs:[mcr5-4],eax
  1618.             mov dword ptr cs:[mcr3-4],eax
  1619.             xor edi,edi
  1620.             add ecx,2
  1621.             xor ebx,ebx
  1622.             xor edx,edx
  1623. txPLOOP:
  1624.             xor ax,ax
  1625.             mov ds,ax
  1626.             push cx
  1627.             xor esi,esi
  1628.             mov si,word ptr ds:[ecx]         ;get the facenumber
  1629.             shl esi,5
  1630.       mdr1: add esi,11223344h
  1631.             mov eax,dword ptr ds:[esi]
  1632.             mov dword ptr cs:[ux1],eax
  1633.             mov ax,word ptr ds:[esi+4]
  1634.             mov word ptr cs:[ux3],ax
  1635.             mov dx,word ptr ds:[esi-12]          ;pointer to vertex3
  1636.             mov bx,word ptr ds:[esi+2-12]        ;pointer to vertex1
  1637.             mov di,word ptr ds:[esi+4-12]        ;pointer to vertex2
  1638.             mov bp, word ptr ds:[edx*8+11223344h]     ;get the vertex1-x
  1639.  mcr6:      mov dx, word ptr ds:[edx*8+2+11223344h]   ;get the vertex1-y
  1640.  mcr5:      mov cx, word ptr ds:[edi*8+11223344h]     ;get the vertex3-x
  1641.  mcr4:      mov di, word ptr ds:[edi*8+2+11223344h]   ;get the vertex3-y
  1642.  mcr3:      mov si, word ptr ds:[ebx*8+2+11223344h]   ;get the vertex2-y
  1643.  mcr2:      mov bx, word ptr ds:[ebx*8+11223344h]     ;get the vertex2-x
  1644.  MCR1:      mov ax, cs
  1645.             mov ds, ax
  1646. ;--------------------------------------------------------------------------
  1647. ; 2D-TEXTURE MAPPING ROUTINE
  1648. ;-------------------------------------------------------------------------
  1649. texturepoly:
  1650. ;mov bp,word ptr ds:[tx1]
  1651. ;mov bx,word ptr ds:[tx2]
  1652. ;mov cx,word ptr ds:[tx3]
  1653. ;mov dx,word ptr ds:[ty1]
  1654. ;mov si,word ptr ds:[ty2]
  1655. ;mov di,word ptr ds:[ty3]
  1656. cmp dx,si
  1657. njne @NOSAME1
  1658. cmp dx,di
  1659. njne @NOSAME1
  1660. cmp si,di
  1661. fje AWAY            ;all y's are same then we skip, maybe unnecessary
  1662. ;cmp bp,-512        ;boundary check removed
  1663. ;jng AWAY
  1664. ;cmp bx,-512
  1665. ;jng AWAY
  1666. ;cmp cx,-512
  1667. ;jng AWAY
  1668. ;cmp dx,-512
  1669. ;jng AWAY
  1670. ;cmp si,-512
  1671. ;jng AWAY
  1672. ;cmp di,-512
  1673. ;jng AWAY
  1674. ;cmp bp,511
  1675. ;jg AWAY
  1676. ;cmp bx,511
  1677. ;jg AWAY
  1678. ;cmp cx,511
  1679. ;jg AWAY
  1680. ;cmp dx,511
  1681. ;jg AWAY
  1682. ;cmp si,511
  1683. ;jg AWAY
  1684. ;cmp di,511
  1685. ;jg AWAY
  1686.  
  1687. @NOSAME1:
  1688. mov ax,bp
  1689. and ax,bx    ;out of screen check  (left)
  1690. and ax,cx
  1691. fjs AWAY
  1692. TPAS1:
  1693. cmp bp,319
  1694. njng TPAS2
  1695. cmp bx,319
  1696. njng TPAS2
  1697. cmp cx,319
  1698. fjg AWAY     ;out of screen check (right)
  1699. TPAS2:
  1700. mov ax,dx
  1701. and ax,si    ;out of screen check (up)
  1702. and ax,di
  1703. fjs AWAY
  1704. TPAS3:
  1705. cmp dx,199
  1706. njng TPAS4
  1707. cmp si,199
  1708. njng TPAS4
  1709. cmp di,199
  1710. fjg AWAY      ;out of screen check (down)
  1711. TPAS4:
  1712. cmp dx,si
  1713. njng EI1
  1714. xchg dx,si
  1715. xchg bp,bx
  1716. mov ax,word ptr ds:[ux2]
  1717. xchg ax,word ptr ds:[ux1]
  1718. mov word ptr ds:[ux2],ax
  1719. Ei1:
  1720. cmp dx,di
  1721. njng EI2
  1722. xchg dx,di
  1723. xchg bp,cx
  1724. mov ax,word ptr ds:[ux3]
  1725. xchg ax,word ptr ds:[ux1]
  1726. mov word ptr ds:[ux3],ax
  1727. Ei2:
  1728. cmp si,di
  1729. njng EI3
  1730. xchg si,di
  1731. xchg bx,cx
  1732. mov ax,word ptr ds:[ux3]
  1733. xchg ax,word ptr ds:[ux2]
  1734. mov word ptr ds:[ux3],ax
  1735. Ei3:
  1736. mov word ptr ds:[ttx1],bp
  1737. mov word ptr ds:[ttx2],bx
  1738. mov word ptr ds:[ttx3],cx
  1739. mov word ptr ds:[tty1],dx
  1740. mov word ptr ds:[tty2],si
  1741. mov word ptr ds:[tty3],di
  1742.  
  1743.   mov word ptr ds:[ys],dx
  1744.   cmp dx,-1
  1745.   njg @INSCREEN
  1746.   mov word ptr ds:[ys],0
  1747.   @INSCREEN:
  1748.   mov word ptr ds:[ye],di
  1749.   cmp di,199
  1750.   njng @INSCREEN2
  1751.   mov word ptr ds:[ye],199
  1752.   @INSCREEN2:
  1753. ;----------------------------------------------------------------------
  1754. ;Line 1 ->  Y1-Y3 left
  1755. ;----------------------------------------------------------------------
  1756. mov ax, bp
  1757. sub ax, cx
  1758. mov bx, dx
  1759. sub bx, di
  1760. dec bx
  1761. cwd
  1762. shl ax,6
  1763. idiv bx
  1764. mov si,ax
  1765. xor ah,ah
  1766. xor dh,dh
  1767. mov cx, word ptr ds:[ux1]
  1768. mov al,cl
  1769. mov dl, byte ptr ds:[ux3]
  1770. sub ax,dx
  1771. cwd
  1772. shl ax,7
  1773. idiv bx
  1774. add ax,ax
  1775. mov word ptr ds:[@f0+2],ax
  1776. xor ah,ah
  1777. xor dh,dh
  1778. mov al, byte ptr ds:[uy1]
  1779. mov dl, byte ptr ds:[uy3]
  1780. sub ax,dx
  1781. cwd
  1782. shl ax,7
  1783. idiv bx
  1784. mov dx,bp;word ptr ds:[ttx1]
  1785. shl dx,6
  1786. mov bp,ax
  1787. add bp,bp
  1788. mov di,word ptr ds:[ys]
  1789. add di,di
  1790. mov ax,word ptr ds:[ye]
  1791. add ax,ax
  1792. add ax,offset xleft
  1793. mov word ptr ds:[@COMP1+2],ax
  1794. mov bh,cl
  1795. xor bl,bl
  1796. xor cl,cl
  1797. add di,offset xleft
  1798.     cmp word ptr ds:[tty1],-1    ;bx=startu scaled by 2^8
  1799.     njg @EDGE1                   ;cx=startv scaled by 2^8
  1800.                                  ;dx=startx scaled by 2^6
  1801.     push dx
  1802.     mov ax,word ptr ds:[tty1]
  1803.     neg ax
  1804.     imul si                      ;-y1*xstep=x(0)
  1805.     pop dx
  1806.     add ax,dx                    ;+start x
  1807.     push ax
  1808.     mov ax,word ptr ds:[tty1]
  1809.     neg ax
  1810.     imul word ptr ds:[@F0+2]
  1811.     add bx,ax                    ;start u
  1812.     mov ax,word ptr ds:[tty1]
  1813.     neg ax
  1814.     imul bp
  1815.     add cx,ax                    ;start v
  1816.     pop dx                       ;start x
  1817.  
  1818. @EDGE1:
  1819.           mov ah,bh
  1820.           mov al,ch
  1821.           mov word ptr ds:[di+800],ax
  1822.           mov word ptr ds:[di],dx
  1823. @F0:      add bx,666;si      ;ustep
  1824.           add cx,bp          ;vstep
  1825.           add dx,si          ;xstep
  1826.           add di,2
  1827. @COMP1:   cmp di,666
  1828.           njb @EDGE1         ;jna
  1829. ;-------------------------------------------------------------------------
  1830. ;Line 2 ->  Y1-Y2 xright
  1831. ;-------------------------------------------------------------------------
  1832. mov ax, word ptr ds:[ttx1]
  1833. mov bp, ax
  1834. sub ax, word ptr ds:[ttx2]
  1835. mov bx, word ptr ds:[tty1]
  1836. mov di,bx
  1837. sub bx, word ptr ds:[tty2]
  1838. dec bx
  1839. cwd
  1840. shl ax,6
  1841. idiv bx
  1842. mov si,ax
  1843. xor ah,ah
  1844. xor dh,dh
  1845. mov cx, word ptr ds:[ux1]
  1846. mov al,cl
  1847. mov dl, byte ptr ds:[ux2]
  1848. sub ax,dx
  1849. cwd
  1850. shl ax,7
  1851. idiv bx
  1852. add ax,ax
  1853. mov word ptr ds:[f2+2],ax
  1854. xor dh,dh
  1855. xor ah,ah
  1856. mov al, byte ptr ds:[uy1]
  1857. mov dl, byte ptr ds:[uy2]
  1858. sub ax,dx
  1859. cwd
  1860. shl ax,7
  1861. idiv bx
  1862. mov dx,bp
  1863. shl dx,6
  1864. mov bp,ax
  1865. mov di,word ptr ds:[ys]
  1866. add di,di
  1867. mov ax,word ptr ds:[tty2]
  1868. cmp ax,-1
  1869. njg  normals
  1870. xor ax,ax
  1871. normals:
  1872. cmp ax,199
  1873. njng normals2
  1874. mov ax,199
  1875. normals2:
  1876. add ax,ax
  1877. add ax,offset xright
  1878. mov word ptr ds:[@COMP12+2],ax
  1879. mov bh,cl
  1880. xor bl,bl
  1881. xor cl,cl
  1882. add bp,bp
  1883. add di,offset xright
  1884.     cmp word ptr ds:[tty1],-1    ;bx=startu scaled by 2^8
  1885.     njg @EDGE12                  ;cx=startv scaled by 2^8
  1886.                                  ;dx=startx scaled by 2^6
  1887.     push dx
  1888.     mov ax,word ptr ds:[tty1]
  1889.     neg ax
  1890.     imul si                      ;-y1*xstep=x(0)
  1891.     pop dx
  1892.     add ax,dx                    ;+start x
  1893.     push ax
  1894.     mov ax,word ptr ds:[tty1]
  1895.     neg ax
  1896.     imul word ptr ds:[F2+2]
  1897.     add bx,ax                    ;start u
  1898.     mov ax,word ptr ds:[tty1]
  1899.     neg ax
  1900.     imul bp
  1901.     add cx,ax                    ;start v
  1902.     pop dx                       ;start x
  1903. @EDGE12:
  1904.           mov ah,bh
  1905.           mov al,ch
  1906.           mov word ptr ds:[di+800],ax
  1907.           mov word ptr ds:[di],dx
  1908. f2:       add bx,6666;si     ;ustep
  1909.           add cx,bp          ;vstep
  1910.           add dx,si          ;xstep
  1911.           add di,2
  1912. @COMP12:  cmp di,666
  1913.           njb @EDGE12
  1914. ;----------------------------------------------------------------------
  1915. ;Line 2 ->  Y2-Y3 xright
  1916. ;----------------------------------------------------------------------
  1917. mov ax, word ptr ds:[ttx2]
  1918. mov bp, ax
  1919. sub ax, word ptr ds:[ttx3]
  1920. mov bx, word ptr ds:[tty2]
  1921. mov di,bx
  1922. cmp di,-1
  1923. njg y2pos
  1924. xor di,di
  1925. y2pos:
  1926. cmp di,199
  1927. njng ypos3
  1928. mov di,199
  1929. ypos3:
  1930. sub bx, word ptr ds:[tty3]
  1931. dec bx
  1932. cwd
  1933. shl ax,6
  1934. idiv bx
  1935. mov si,ax
  1936. xor ah,ah
  1937. xor dh,dh
  1938. mov cx, word ptr ds:[ux2]
  1939. mov al,cl
  1940. mov dl, byte ptr ds:[ux3]
  1941. sub ax,dx
  1942. cwd
  1943. shl ax,7
  1944. idiv bx
  1945. add ax,ax
  1946. mov word ptr ds:[f3+2],ax
  1947. xor ah,ah
  1948. xor dh,dh
  1949. mov al, byte ptr ds:[uy2]
  1950. mov dl, byte ptr ds:[uy3]
  1951. sub ax,dx
  1952. cwd
  1953. shl ax,7
  1954. idiv bx
  1955. mov dx,bp
  1956. shl dx,6
  1957. mov bp,ax
  1958. add di,di
  1959. mov ax,word ptr ds:[ye]
  1960. add ax,ax
  1961. add ax,offset xright
  1962. mov word ptr ds:[@COMP123+2],ax
  1963. sub ax,offset xright-offset yadd
  1964. mov word ptr ds:[ENDLINE+2],ax
  1965. mov bh,cl
  1966. xor bl,bl
  1967. xor cl,cl
  1968. add bp,bp
  1969. add di,offset xright
  1970.  
  1971.     cmp word ptr ds:[tty2],-1    ;bx=startu scaled by 2^8
  1972.     njg @EDGE123                 ;cx=startv scaled by 2^8
  1973.                                  ;dx=startx scaled by 2^6
  1974.     push dx
  1975.     mov ax,word ptr ds:[tty2]
  1976.     neg ax
  1977.     imul si                      ;-y1*xstep=x(0)
  1978.     pop dx
  1979.     add ax,dx                    ;+start x
  1980.     push ax
  1981.     mov ax,word ptr ds:[tty2]
  1982.     neg ax
  1983.     imul word ptr ds:[F3+2]
  1984.     add bx,ax                    ;start u
  1985.     mov ax,word ptr ds:[tty2]
  1986.     neg ax
  1987.     imul bp
  1988.     add cx,ax                    ;start v
  1989.     pop dx                       ;start x
  1990.  
  1991. @EDGE123:
  1992.           mov ah,bh
  1993.           mov al,ch
  1994.           mov word ptr ds:[di+800],ax
  1995.           mov word ptr ds:[di],dx
  1996. f3:       add bx,5555            ;ustep
  1997.           add cx,bp              ;vstep
  1998.           add dx,si              ;xstep
  1999.           add di,2
  2000. @COMP123: cmp di,666
  2001.           njb @EDGE123           ;jna
  2002. ; ----------------------------------------------------------------------
  2003. ;  Draw texture polygon
  2004. ; -----------------------------------------------------------------------
  2005.           mov si,word ptr ds:[ys]
  2006.           add si,si
  2007.           add si,offset yadd
  2008.           mov ax,seg texture
  2009.           mov ds,ax
  2010.           @NEWLINES:
  2011.           push si
  2012.           mov di,word ptr cs:[si]       ;yadd
  2013.           mov cx,word ptr cs:[si+400]   ;xleft
  2014.           mov dx,word ptr cs:[si+800]   ;xright
  2015.           mov bp,word ptr cs:[si+1200]  ;textleft
  2016.           mov si,word ptr cs:[si+1600]  ;textright
  2017.           cmp dx,cx
  2018.           njng @NOCHANGE
  2019.           xchg cx,dx
  2020.           xchg bp,si
  2021.           @NOCHANGE:
  2022.           mov ax,bp
  2023.           mov al,ah
  2024.           xor ah,ah
  2025.           mov bx,si
  2026.           mov bl,bh
  2027.           xor bh,bh
  2028.           and bp,255
  2029.           and si,255
  2030.           sar cx,6       ;remove scaling
  2031.           sar dx,6       ;remove scaling
  2032.           cmp dx,319
  2033.           fjg @LINJA               ;if xstart>319 then skip
  2034.           mov word ptr cs:[xs],dx
  2035.           add di,dx
  2036.           cmp cx,-1
  2037.           fjng @LINJA              ;if xend<0 then skip
  2038.           mov word ptr cs:[xe],cx
  2039.           sub cx,dx
  2040.           inc cx                   ;cant be zero   ;cx=length of line
  2041.           xor dx,dx
  2042.           sub ax,bx
  2043.           sbb dx,0
  2044.           shl ax,7
  2045.           idiv cx                ;2 divs per scanline crap.......
  2046.           add ax,ax
  2047.           xor dx,dx
  2048.           sub bp,si
  2049.           sbb dx,0                 ;xor dx,dx + sbb dx,0 is faster than CWD...
  2050.           xchg ax,bp
  2051.           shl ax,7
  2052.           idiv cx
  2053.           add ax,ax
  2054.           xor dx,dx
  2055.           mov dh,bl
  2056.           shl si,8                 ;si=texture startu (y)
  2057.                                    ;dx=texture startv (x)
  2058.                                    ;bp=vstep, ax=ustep
  2059.           cmp word ptr cs:[xe],319
  2060.           njng @NORIGHTCLIP
  2061.           sub cx,word ptr cs:[xe]
  2062.           add cx,319
  2063.           @NORIGHTCLIP:
  2064.           cmp word ptr cs:[xs],-1
  2065.           njg @NRMAL
  2066.           push ax                   ;save the step
  2067.           sub di,word ptr cs:[xs]   ;start x=zero
  2068.           add cx,word ptr cs:[xs]   ;sub length
  2069.           push ax                   ;ax=vstep (y)
  2070.           mov bx, dx                ;startu
  2071.           mov ax,word ptr cs:[xs]
  2072.           neg ax
  2073.           imul bp                   ;ustep
  2074.           mov dx,bx
  2075.           add ax,dx                 ;new startu
  2076.           mov bx,ax                 ;save it
  2077.           mov dx,word ptr cs:[xs]
  2078.           neg dx
  2079.           pop ax                    ;vstep
  2080.           imul dx
  2081.           add si,ax                 ;new startu
  2082.           mov dx,bx                 ;new startv
  2083.           pop ax                    ;restore the step
  2084.           @NRMAL:
  2085.           dec cx
  2086.           shr cx,1
  2087.           njnc @ODD
  2088.           mov bx,si
  2089.           mov bl,dh
  2090.           mov bl,byte ptr ds:[bx]
  2091.           mov byte ptr es:[di],bl
  2092.           add dx,bp
  2093.           add si,ax
  2094.           inc di
  2095.           @ODD:
  2096.           or cx,cx
  2097.           fje @LINJA
  2098.           test di,1        ;zero set if even
  2099.           fjne @FIXALIGN
  2100.           neg cx
  2101.           add cx,160
  2102.           mov bx,cx
  2103.           add bx,bx
  2104.           mov bx,word ptr cs:[bx+kadd]
  2105.           mov cx,ax
  2106.           jmp bx
  2107.           HORLINE:
  2108.                    rept 160
  2109.                    mov bx,si                ;2
  2110.                    mov bl,dh                ;2  ;4
  2111.                    mov al,byte ptr ds:[bx]  ;2  ;6
  2112.                    add dx,bp                ;2  ;8
  2113.                    add si,cx                ;2  ;10
  2114.                    mov bx,si                ;2  ;12
  2115.                    mov bl,dh                ;2  ;14
  2116.                    mov ah,byte ptr ds:[bx]  ;2  ;16
  2117.                    mov word ptr es:[di],ax  ;3  ;19
  2118.                    add dx,bp                ;2  ;21
  2119.                    add si,cx                ;2  ;23
  2120.                    add di,2                 ;3  ;26
  2121.                    endm
  2122.  
  2123. @LINJA:
  2124.           pop si
  2125.           add si,2
  2126.  ENDLINE: cmp si,7777
  2127.           fjb @NEWLINES
  2128. AWAY:
  2129.             pop cx
  2130.             sub ecx,4
  2131.             cmp ecx,11223344h
  2132. MOO:        jnb txPLOOP
  2133.             ret
  2134.  
  2135. @FIXALIGN:
  2136.           mov bx,si
  2137.           mov bl,dh
  2138.           mov bl,byte ptr ds:[bx]
  2139.           mov byte ptr es:[di],bl
  2140.           add dx,bp
  2141.           add si,ax
  2142.           inc di
  2143.           neg cx        ;
  2144.           add cx,161
  2145.           mov bx,cx
  2146.           add bx,bx
  2147.           mov bx,word ptr cs:[bx+kadd2]
  2148.           mov cx,ax
  2149.           jmp bx
  2150.           HORLINE2:
  2151.                    rept 160
  2152.                    mov bx,si                ;2
  2153.                    mov bl,dh                ;2
  2154.                    mov al,byte ptr ds:[bx]  ;2
  2155.                    add dx,bp                ;2
  2156.                    add si,cx                ;2
  2157.                    mov bx,si                ;2
  2158.                    mov bl,dh                ;2
  2159.                    mov ah,byte ptr ds:[bx]  ;2
  2160.                    mov word ptr es:[di],ax  ;3
  2161.                    add dx,bp                ;2
  2162.                    add si,cx                ;2
  2163.                    add di,2                 ;3
  2164.                    endm
  2165.           mov bx,si
  2166.           mov bl,dh
  2167.           mov bl,byte ptr ds:[bx]
  2168.           mov byte ptr es:[di],bl
  2169.           jmp @LINJA
  2170.  
  2171.  
  2172. M_ALKU:                                          ;routine size checker
  2173.                    mov bx,si                ;2
  2174.                    mov bl,dh                ;2
  2175.                    mov al,byte ptr ds:[bx]  ;2
  2176.                    add dx,bp                ;2
  2177.                    add si,cx                ;2
  2178.                    mov bx,si                ;2
  2179.                    mov bl,dh                ;2
  2180.                    mov ah,byte ptr ds:[bx]  ;2
  2181.                    mov word ptr es:[di],ax  ;3
  2182.                    add dx,bp                ;2
  2183.                    add si,cx                ;2
  2184.                    add di,2                 ;3
  2185. M_LOPPU:
  2186.  
  2187.  
  2188. ;----------------------------------------------------------------------------
  2189. align 2
  2190.          xhandle        dw 0
  2191.          xmscontrol     dd 0
  2192.          fhandle        dw 0
  2193.          objectxms      dd 0  ;pointers to XMS-blocks
  2194.          projectionbuffer      dd 0
  2195.          envbufxms      dd 0
  2196.          sorttixms      dd 0
  2197.          onearrayxms    dd 0
  2198.          lastxms        dd 0
  2199.          indexinxms     dd 0
  2200.          indexoutxms    dd 0
  2201.          itemcount      dw 0
  2202.          bytenumber     dw 0
  2203.  
  2204.          elements    dw 1  ; how many different objects in the world are.
  2205.          elementxms  dd 0   ;4 bytes for each element, xms ptr
  2206.                      dd 0
  2207.                      dd 0
  2208.                      dd 0
  2209.                      dd 0
  2210.  
  2211.          elementenvxms dd 0    ;ptr for each environment map
  2212.                        dd 0    ;lame way to waste memory.......
  2213.                        dd 0
  2214.  
  2215.          transformers dw 0    ;destination element number
  2216.                       dw 1    ;source 1 element  number
  2217.                       dw 2    ;source 2 element  number
  2218.                               ;remember: (dest#<source1#<source2#)
  2219.          worldxangle dw 0
  2220.          worldyangle dw 0
  2221.          worldzangle dw 0
  2222.          viewpointx  dw 0
  2223.          viewpointy  dw 0
  2224.          viewpointz  dw 0
  2225.          viewpointxy dw 0
  2226.          camerazpos    dw 4000
  2227.          cameraypos    dw 0
  2228.          cameraxpos    dw 0
  2229.  
  2230.          world dw 2     ;how many objects there are
  2231.                         ;object format begin
  2232.                db 0     ;object type, supports 255 different objects
  2233.                db 0     ;object rotate model:
  2234.                         ;255=object is independent to the world
  2235.                         ;0=object   is stable
  2236.                dw -2000     ;object.world.x pos
  2237.                dw 0     ;object.world.y pos
  2238.                dw 0     ;object.world.z pos
  2239.                dw 0     ;object.world.xy pos, just put zero here,code calcs it
  2240.                dw 0     ;object.own.xangle
  2241.                dw 0     ;object.own.yangle
  2242.                dw 0     ;object.own.zangle
  2243.                dw 8 dup (0) ;TEMPORARY SPACE FOR OBJECT !!!!!!!!!!!!
  2244.  
  2245.                db 0     ;object type, supports 255 different objects
  2246.                db 255   ;object rotate model:
  2247.                         ;255=object is independent to the world
  2248.                         ;0=object   is stable
  2249.                dw 2000     ;object.world.x pos
  2250.                dw 0     ;object.world.y pos
  2251.                dw 0     ;object.world.z pos
  2252.                dw 0     ;object.world.xy pos, just put zero here,code calcs it
  2253.                dw 0     ;object.own.xangle
  2254.                dw 0     ;object.own.yangle
  2255.                dw 0     ;object.own.zangle
  2256.                dw 8 dup (0) ;TEMPORARY SPACE FOR OBJECT !!!!!!!!!!!!
  2257.  
  2258. sortti2    dw 128 dup (0)     ;max is 64 objects
  2259. onearray2  dw 128 dup (0)
  2260. zeroarray2 dw 128 dup (0)
  2261. tempobj dw 0       ;in process object type
  2262. tempxp  dw 0       ;-----""--------- xpos
  2263. tempyp  dw 0       ;                 ypos
  2264. tempzp  dw 0       ;                 zpos
  2265. tempxy  dw 0       ;                 xypos
  2266. tempax  dw 0     ;object.own.xangle
  2267. tempay  dw 0     ;object.own.yangle
  2268. tempaz  dw 0     ;object.own.zangle
  2269. swapxy  dw 0
  2270. swap    dw 0
  2271. mframe  dw 0
  2272. madd    dw 4
  2273. ticks   dd 0
  2274. oldint  dd 0
  2275. facecount dw 0
  2276. xlen  dw 0
  2277. ylen  dw 0
  2278. fx1   dd 0
  2279. fx2   dd 0
  2280. fx3   dd 0
  2281. fy1   dd 0
  2282. fy2   dd 0
  2283. fy3   dd 0
  2284. xx1   dd 0
  2285. xx2   dd 0
  2286. xx3   dd 0
  2287. xy1   dd 0
  2288. xy2   dd 0
  2289. xy3   dd 0
  2290. ystr  dw 0
  2291. yend  dd 0
  2292. tx1   dw 0
  2293. tx2   dw 0
  2294. tx3   dw 0
  2295. ty1   dw 0
  2296. ty2   dw 0
  2297. ty3   dw 0
  2298. ttx1   dw 0
  2299. ttx2   dw 0
  2300. ttx3   dw 0
  2301. tty1   dw 0
  2302. tty2   dw 0
  2303. tty3   dw 0
  2304. xstep  dw 0
  2305. ustep  dw 0
  2306. vstep  dw 0
  2307. tstartv dw 0
  2308. tstartu dw 0
  2309. ux1   db 0
  2310. uy1   db 0
  2311. ux2   db 0
  2312. uy2   db 0
  2313. ux3   db 0
  2314. uy3   db 0
  2315. yadd   dw 200 dup (0)
  2316. xleft  dw 200 dup (0)
  2317. xright dw 200 dup (0)
  2318. uleft  dw 200 dup (0)
  2319. uright dw 200 dup (0)
  2320. kadd   dw 600 dup (0)
  2321. kadd2  dw 600 dup (0)
  2322. facesb dw 0
  2323. fcount dw 0
  2324. maski dw 0
  2325. xpos2d dw 160
  2326. ypos2d dw 100
  2327. zclipnear dw 512           ;ZCLIP NEAR
  2328. ye  dw 0
  2329. ys  dw 0
  2330. xs  dw 0
  2331. xe  dw 0
  2332. six dw 0
  2333. siy dw 0
  2334. siz dw 0
  2335. cox dw 0
  2336. coy dw 0
  2337. coz dw 0
  2338. r11 dw 0
  2339. r12 dw 0
  2340. r13 dw 0
  2341. r21 dw 0
  2342. r22 dw 0
  2343. r23 dw 0
  2344. r31 dw 0
  2345. r32 dw 0
  2346. r33 dw 0
  2347. frame dd 0
  2348. temp  dw 0
  2349. align 2
  2350. sine dw 1,2,4,5,7,8,10,11,13,15,16,18,19,21,22,24,26    ;1024 angles
  2351. dw 27,29,30,32,33,35,37,38,40,41,43,44,46,47,49,50
  2352. dw 52,54,55,57,58,60,61,63,64,66,67,69,70,72,73,75
  2353. dw 76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,98
  2354. dw 100,101,103,104,106,107,109,110,111,113,114,116,117,118,120,121
  2355. dw 123,124,125,127,128,129,131,132,133,135,136,137,139,140,141,143
  2356. dw 144,145,147,148,149,150,152,153,154,156,157,158,159,160,162,163
  2357. dw 164,165,167,168,169,170,171,172,174,175,176,177,178,179,180,182
  2358. dw 183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198
  2359. dw 199,200,201,202,203,204,205,206,207,208,209,210,211,212,212,213
  2360. dw 214,215,216,217,218,218,219,220,221,222,222,223,224,225,226,226
  2361. dw 227,228,228,229,230,231,231,232,233,233,234,235,235,236,236,237
  2362. dw 238,238,239,239,240,240,241,242,242,243,243,244,244,245,245,245
  2363. dw 246,246,247,247,248,248,248,249,249,250,250,250,251,251,251,252
  2364. dw 252,252,252,253,253,253,253,254,254,254,254,255,255,255,255,255
  2365. dw 255,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256
  2366. dw 256,256,256,256,256,256,256,256,256,256,256,256,256,256,255,255
  2367. dw 255,255,255,255,254,254,254,254,253,253,253,253,252,252,252,252
  2368. dw 251,251,251,250,250,250,249,249,248,248,248,247,247,246,246,245
  2369. dw 245,245,244,244,243,243,242,242,241,240,240,239,239,238,238,237
  2370. dw 236,236,235,235,234,233,233,232,231,231,230,229,228,228,227,226
  2371. dw 226,225,224,223,222,222,221,220,219,218,218,217,216,215,214,213
  2372. dw 212,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198
  2373. dw 197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182
  2374. dw 180,179,178,177,176,175,174,172,171,170,169,168,167,165,164,163
  2375. dw 162,160,159,158,157,156,154,153,152,150,149,148,147,145,144,143
  2376. dw 141,140,139,137,136,135,133,132,131,129,128,127,125,124,123,121
  2377. dw 120,118,117,116,114,113,111,110,109,107,106,104,103,101,100,98
  2378. dw 97,96,94,93,91,90,88,87,85,84,82,81,79,78,76,75
  2379. dw 73,72,70,69,67,66,64,63,61,60,58,57,55,54,52,50
  2380. dw 49,47,46,44,43,41,40,38,37,35,33,32,30,29,27,26
  2381. dw 24,22,21,19,18,16,15,13,11,10,8,7,5,4,2,1
  2382. dw -1,-3,-4,-6,-7,-9,-10,-12,-14,-15,-17,-18,-20,-21,-23,-25
  2383. dw -26,-28,-29,-31,-32,-34,-36,-37,-39,-40,-42,-43,-45,-46,-48,-49
  2384. dw -51,-53,-54,-56,-57,-59,-60,-62,-63,-65,-66,-68,-69,-71,-72,-74
  2385. dw -75,-77,-78,-80,-81,-83,-84,-86,-87,-89,-90,-92,-93,-95,-96,-97
  2386. dw -99,-100,-102,-103,-105,-106,-108,-109,-110,-112,-113,-115,-116,-117,-119,-120
  2387. dw -122,-123,-124,-126,-127,-128,-130,-131,-132,-134,-135,-136,-138,-139,-140,-142
  2388. dw -143,-144,-146,-147,-148,-149,-151,-152,-153,-155,-156,-157,-158,-159,-161,-162
  2389. dw -163,-164,-166,-167,-168,-169,-170,-171,-173,-174,-175,-176,-177,-178,-179,-181
  2390. dw -182,-183,-184,-185,-186,-187,-188,-189,-190,-191,-192,-193,-194,-195,-196,-197
  2391. dw -198,-199,-200,-201,-202,-203,-204,-205,-206,-207,-208,-209,-210,-211,-211,-212
  2392. dw -213,-214,-215,-216,-217,-217,-218,-219,-220,-221,-221,-222,-223,-224,-225,-225
  2393. dw -226,-227,-227,-228,-229,-230,-230,-231,-232,-232,-233,-234,-234,-235,-235,-236
  2394. dw -237,-237,-238,-238,-239,-239,-240,-241,-241,-242,-242,-243,-243,-244,-244,-244
  2395. dw -245,-245,-246,-246,-247,-247,-247,-248,-248,-249,-249,-249,-250,-250,-250,-251
  2396. dw -251,-251,-251,-252,-252,-252,-252,-253,-253,-253,-253,-254,-254,-254,-254,-254
  2397. dw -254,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255
  2398. dw -255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-254,-254
  2399. dw -254,-254,-254,-254,-253,-253,-253,-253,-252,-252,-252,-252,-251,-251,-251,-251
  2400. dw -250,-250,-250,-249,-249,-249,-248,-248,-247,-247,-247,-246,-246,-245,-245,-244
  2401. dw -244,-244,-243,-243,-242,-242,-241,-241,-240,-239,-239,-238,-238,-237,-237,-236
  2402. dw -235,-235,-234,-234,-233,-232,-232,-231,-230,-230,-229,-228,-227,-227,-226,-225
  2403. dw -225,-224,-223,-222,-221,-221,-220,-219,-218,-217,-217,-216,-215,-214,-213,-212
  2404. dw -211,-211,-210,-209,-208,-207,-206,-205,-204,-203,-202,-201,-200,-199,-198,-197
  2405. dw -196,-195,-194,-193,-192,-191,-190,-189,-188,-187,-186,-185,-184,-183,-182,-181
  2406. dw -179,-178,-177,-176,-175,-174,-173,-171,-170,-169,-168,-167,-166,-164,-163,-162
  2407. dw -161,-159,-158,-157,-156,-155,-153,-152,-151,-149,-148,-147,-146,-144,-143,-142
  2408. dw -140,-139,-138,-136,-135,-134,-132,-131,-130,-128,-127,-126,-124,-123,-122,-120
  2409. dw -119,-117,-116,-115,-113,-112,-110,-109,-108,-106,-105,-103,-102,-100,-99,-97
  2410. dw -96,-95,-93,-92,-90,-89,-87,-86,-84,-83,-81,-80,-78,-77,-75,-74
  2411. dw -72,-71,-69,-68,-66,-65,-63,-62,-60,-59,-57,-56,-54,-53,-51,-49
  2412. dw -48,-46,-45,-43,-42,-40,-39,-37,-36,-34,-32,-31,-29,-28,-26,-25
  2413. dw -23,-21,-20,-18,-17,-15,-14,-12,-10,-9,-7,-6,-4,-3,-1,1
  2414. cose dw 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,255,255
  2415. dw 255,255,255,255,254,254,254,254,253,253,253,253,252,252,252,252
  2416. dw 251,251,251,250,250,250,249,249,248,248,248,247,247,246,246,245
  2417. dw 245,245,244,244,243,243,242,242,241,240,240,239,239,238,238,237
  2418. dw 236,236,235,235,234,233,233,232,231,231,230,229,228,228,227,226
  2419. dw 226,225,224,223,222,222,221,220,219,218,218,217,216,215,214,213
  2420. dw 212,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198
  2421. dw 197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182
  2422. dw 180,179,178,177,176,175,174,172,171,170,169,168,167,165,164,163
  2423. dw 162,160,159,158,157,156,154,153,152,150,149,148,147,145,144,143
  2424. dw 141,140,139,137,136,135,133,132,131,129,128,127,125,124,123,121
  2425. dw 120,118,117,116,114,113,111,110,109,107,106,104,103,101,100,98
  2426. dw 97,96,94,93,91,90,88,87,85,84,82,81,79,78,76,75
  2427. dw 73,72,70,69,67,66,64,63,61,60,58,57,55,54,52,50
  2428. dw 49,47,46,44,43,41,40,38,37,35,33,32,30,29,27,26
  2429. dw 24,22,21,19,18,16,15,13,11,10,8,7,5,4,2,1
  2430. dw -1,-3,-4,-6,-7,-9,-10,-12,-14,-15,-17,-18,-20,-21,-23,-25
  2431. dw -26,-28,-29,-31,-32,-34,-36,-37,-39,-40,-42,-43,-45,-46,-48,-49
  2432. dw -51,-53,-54,-56,-57,-59,-60,-62,-63,-65,-66,-68,-69,-71,-72,-74
  2433. dw -75,-77,-78,-80,-81,-83,-84,-86,-87,-89,-90,-92,-93,-95,-96,-97
  2434. dw -99,-100,-102,-103,-105,-106,-108,-109,-110,-112,-113,-115,-116,-117,-119,-120
  2435. dw -122,-123,-124,-126,-127,-128,-130,-131,-132,-134,-135,-136,-138,-139,-140,-142
  2436. dw -143,-144,-146,-147,-148,-149,-151,-152,-153,-155,-156,-157,-158,-159,-161,-162
  2437. dw -163,-164,-166,-167,-168,-169,-170,-171,-173,-174,-175,-176,-177,-178,-179,-181
  2438. dw -182,-183,-184,-185,-186,-187,-188,-189,-190,-191,-192,-193,-194,-195,-196,-197
  2439. dw -198,-199,-200,-201,-202,-203,-204,-205,-206,-207,-208,-209,-210,-211,-211,-212
  2440. dw -213,-214,-215,-216,-217,-217,-218,-219,-220,-221,-221,-222,-223,-224,-225,-225
  2441. dw -226,-227,-227,-228,-229,-230,-230,-231,-232,-232,-233,-234,-234,-235,-235,-236
  2442. dw -237,-237,-238,-238,-239,-239,-240,-241,-241,-242,-242,-243,-243,-244,-244,-244
  2443. dw -245,-245,-246,-246,-247,-247,-247,-248,-248,-249,-249,-249,-250,-250,-250,-251
  2444. dw -251,-251,-251,-252,-252,-252,-252,-253,-253,-253,-253,-254,-254,-254,-254,-254
  2445. dw -254,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255
  2446. dw -255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-254,-254
  2447. dw -254,-254,-254,-254,-253,-253,-253,-253,-252,-252,-252,-252,-251,-251,-251,-251
  2448. dw -250,-250,-250,-249,-249,-249,-248,-248,-247,-247,-247,-246,-246,-245,-245,-244
  2449. dw -244,-244,-243,-243,-242,-242,-241,-241,-240,-239,-239,-238,-238,-237,-237,-236
  2450. dw -235,-235,-234,-234,-233,-232,-232,-231,-230,-230,-229,-228,-227,-227,-226,-225
  2451. dw -225,-224,-223,-222,-221,-221,-220,-219,-218,-217,-217,-216,-215,-214,-213,-212
  2452. dw -211,-211,-210,-209,-208,-207,-206,-205,-204,-203,-202,-201,-200,-199,-198,-197
  2453. dw -196,-195,-194,-193,-192,-191,-190,-189,-188,-187,-186,-185,-184,-183,-182,-181
  2454. dw -179,-178,-177,-176,-175,-174,-173,-171,-170,-169,-168,-167,-166,-164,-163,-162
  2455. dw -161,-159,-158,-157,-156,-155,-153,-152,-151,-149,-148,-147,-146,-144,-143,-142
  2456. dw -140,-139,-138,-136,-135,-134,-132,-131,-130,-128,-127,-126,-124,-123,-122,-120
  2457. dw -119,-117,-116,-115,-113,-112,-110,-109,-108,-106,-105,-103,-102,-100,-99,-97
  2458. dw -96,-95,-93,-92,-90,-89,-87,-86,-84,-83,-81,-80,-78,-77,-75,-74
  2459. dw -72,-71,-69,-68,-66,-65,-63,-62,-60,-59,-57,-56,-54,-53,-51,-49
  2460. dw -48,-46,-45,-43,-42,-40,-39,-37,-36,-34,-32,-31,-29,-28,-26,-25
  2461. dw -23,-21,-20,-18,-17,-15,-14,-12,-10,-9,-7,-6,-4,-3,-1,1
  2462. dw 2,4,5,7,8,10,11,13,15,16,18,19,21,22,24,26
  2463. dw 27,29,30,32,33,35,37,38,40,41,43,44,46,47,49,50
  2464. dw 52,54,55,57,58,60,61,63,64,66,67,69,70,72,73,75
  2465. dw 76,78,79,81,82,84,85,87,88,90,91,93,94,96,97,98
  2466. dw 100,101,103,104,106,107,109,110,111,113,114,116,117,118,120,121
  2467. dw 123,124,125,127,128,129,131,132,133,135,136,137,139,140,141,143
  2468. dw 144,145,147,148,149,150,152,153,154,156,157,158,159,160,162,163
  2469. dw 164,165,167,168,169,170,171,172,174,175,176,177,178,179,180,182
  2470. dw 183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198
  2471. dw 199,200,201,202,203,204,205,206,207,208,209,210,211,212,212,213
  2472. dw 214,215,216,217,218,218,219,220,221,222,222,223,224,225,226,226
  2473. dw 227,228,228,229,230,231,231,232,233,233,234,235,235,236,236,237
  2474. dw 238,238,239,239,240,240,241,242,242,243,243,244,244,245,245,245
  2475. dw 246,246,247,247,248,248,248,249,249,250,250,250,251,251,251,252
  2476. dw 252,252,252,253,253,253,253,254,254,254,254,255,255,255,255,255
  2477. dw 255,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256
  2478. flipflop db 1              ;select page
  2479. msg   db 'Exit OK.     ',0dh,0ah,'$'       ;error msgs
  2480.       db 'Undefined    ',0dh,0ah,'$'
  2481.       db 'No XMS-driver',0dh,0ah,'$'
  2482.       db 'Out of XMS   ',0dh,0ah,'$'
  2483.       db 'File missing ',0dh,0ah,'$'
  2484.       db 'Undefined    ',0dh,0ah,'$'
  2485.       db 'Undefined    ',0dh,0ah,'$'
  2486.       db 'Remove EMM!  ',0dh,0ah,'$'
  2487.       db 'Undefined    ',0dh,0ah,'$'
  2488.       db 'Undefined    ',0dh,0ah,'$'
  2489.       db 'Undefined    ',0dh,0ah,'$'
  2490. tfx db 0
  2491. color  db 1
  2492. names  db 'ob2.dcc',0  ;here file names, 8 max char
  2493.        db 'ri2.dcc',0
  2494.        db 'ob2.dcc',0
  2495.  
  2496. title3 db 0dh,0ah, 'Ducks 3D for 32bit RealFlatMode by Zjack/DCC',0dh,0ah,'$'
  2497. title2 db 'Loading stuff.','$'
  2498. dot    db '.','$'
  2499. errr  db 0                    ;errormsg  (0=exit ok)
  2500. pal DB 82,73,88,51,0,1,0,1,175,0,0,0,0,3,3,3,7,7,7,12
  2501.  DB 11,11,16,15,15,20,19,19,24,24,24,29,28,28,33,32,32,37,36,36
  2502.  DB 41,40,40,46,44,44,50,48,48,54,52,52,58,57,57,63,61,61,24,22
  2503.  DB 22,63,57,57,20,18,18,61,55,55,59,53,53,18,16,16,16,14,14,59
  2504.  DB 51,51,28,24,24,14,12,12,26,22,22,12,10,10,37,30,30,10,8,8
  2505.  DB 57,45,45,61,47,47,59,45,45,57,43,43,61,45,45,8,6,6,59,43
  2506.  DB 43,6,4,4,4,2,2,2,0,0,28,26,24,20,18,14,22,20,14,63
  2507.  DB 63,61,24,24,22,20,20,18,16,16,14,24,24,20,20,20,16,18,18,14
  2508.  DB 16,16,12,20,20,14,22,22,14,16,18,12,16,18,14,18,20,16,12,14
  2509.  DB 10,14,16,12,20,22,20,22,24,22,16,18,16,14,16,14,12,14,12,16
  2510.  DB 20,16,8,10,8,14,18,14,12,16,12,10,14,10,4,6,4,2,4,2
  2511.  DB 10,16,12,8,14,10,20,24,22,12,16,14,4,8,6,16,20,18,10,14
  2512.  DB 12,8,12,10,14,18,16,20,28,24,6,10,8,41,59,51,10,16,14,8
  2513.  DB 14,12,22,28,26,6,12,10,22,30,28,20,22,22,22,24,24,18,20,20
  2514.  DB 16,18,18,12,14,14,10,12,12,8,10,10,14,18,18,6,8,8,10,14
  2515.  DB 14,8,12,12,4,6,6,2,4,4,4,8,8,35,41,43,22,28,30,33
  2516.  DB 39,41,24,30,33,22,26,28,20,24,26,33,37,39,24,28,30,26,30,33
  2517.  DB 22,28,33,30,33,35,33,35,37,24,26,28,35,39,43,24,28,33,20,22
  2518.  DB 24,30,33,37,22,24,28,33,35,39,24,26,30,35,37,41,26,28,33,20
  2519.  DB 22,26,37,37,39,35,35,37,28,28,30,30,30,33,26,26,28,24,24,26
  2520.  DB 20,20,22,22,22,24,37,37,41,33,33,37,30,30,35,12,12,14,8,8
  2521.  DB 10,6,6,8,37,35,39,28,26,30,24,22,26,37,35,37,35,33,35,30
  2522.  DB 28,30,33,30,33,26,24,26,22,20,22,24,22,24,37,33,37,18,16,18
  2523.  DB 30,26,30,16,14,16,28,24,28,14,12,14,12,10,12,37,30,37,35,28
  2524.  DB 35,10,8,10,41,33,41,39,30,39,37,28,37,8,6,8,6,4,6,4
  2525.  DB 2,4,2,0,2,43,33,41,43,35,41,39,30,37,37,28,35,35,26,33
  2526.  DB 41,33,39,35,28,33,30,24,28,45,33,41,33,26,30,45,35,41,39,28
  2527.  DB 35,41,30,37,43,33,39,35,30,33,26,22,24,18,14,16,37,33,35,30
  2528.  DB 26,28,28,24,26,22,18,20,20,16,18,39,30,35,37,28,33,47,35,41
  2529.  DB 33,28,30,24,20,22,43,35,39,41,33,37,35,26,30,16,12,14,45,33
  2530.  DB 39,49,39,43,41,30,35,39,28,33,45,35,39,43,33,37,61,55,57,37
  2531.  DB 30,33,28,22,24,63,57,59,39,33,35,30,24,26,59,47,51,49,37,41
  2532.  DB 43,30,35,35,28,30,33,26,28,55,43,47,53,41,45,47,35,39,45,33
  2533.  DB 37,51,37,41,55,47,49,39,30,33,55,41,45,61,53,55,59,51,53,57
  2534.  DB 49,51,45,37,39,43,35,37,41,33,35,37,28,30,35,26,28,57,47,49
  2535.  DB 49,39,41,41,30,33,61,51,53,59,49,51,55,45,47,53,43,45,47,37
  2536.  DB 39,45,35,37,43,33,35,39,28,30,59,47,49,51,39,41,57,45,47,55
  2537.  DB 43,45,53,41,43,49,37,39,47,35,37,53,39,41,45,33,35,59,45,47
  2538.  DB 57,43,45,55,41,43,59,43,45,57,41,43,59,41,43,63,63,63,162,98
  2539. end
  2540.